开始一直犹豫是不是要学cmake对于一个没有项目驱动的人来数,感觉用不用都可以。我大可用一个简单的Makefile模板来做一些简单的工程阿。或者我还可以用autotools等。
不过既然已经看了一个晚上了,还是把它弄懂点吧,记得曾经用过automake,好像没有弄到自己感觉满意就放下了。现在这个cmake好像简单些,借前人的话说就是用CMAKE本身也是在编程。当反复写了几个helloworld的工程(cmake下)后,发现比人工写 makefile要容易,比autoconfig要快些。 自我感觉专业一点,。
├── bin │ └── main ├── build ├── CMakeLists.txt ├── doc ├── README └── src ├── CMakeLists.txt ├── libs │ ├── hello.cpp │ └── hello.h ├── main.cpp └── modules
#项目名称 PROJECT(hello) #声明要求的最小版本 cmake_minimum_required(VERSION 2.6) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -Wall -O2") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall -O2") #添加参与编译的子目录 我理解为:添加下一个CMakeLists.txt add_subdirectory(src)
src下的
#添加头文件的查找目录 && 在编译参数"-l" ,指定搜索头文件的路径 INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/src/libs) SET(SEC_LIST main.cpp libs/hello.cpp ) ADD_EXECUTABLE(main ${SEC_LIST}) #TARGET_LINK_LIBRARIES 用来链接 -l后的文件依赖 #TARGET_LINK_LIBRARIES(CRNode thread) #EXECUTABLE_OUTPUT_PATH && LIBRARY_OUTPUT_PATH用来指定二进制文件位置和库文件路径,这里不包括中间文件 SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin) #关于install 请看http://now-code.com/archives/208
要专业一点还是写写“库”吧。
├── bin ├── build ├── CMakeLists.txt ├── doc ├── README └── src ├── apps │ ├── CMakeLists.txt │ └── main.cpp ├── CMakeLists.txt ├── includes │ └── hello.h ├── libs │ ├── CMakeLists.txt │ └── hello.cpp └── modules根目录下:
PROJECT(hello) cmake_minimum_required(VERSION 2.6) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -Wall -O2") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall -O2") add_subdirectory(src)
set(myexe_EXEC_SRCS main.cpp # 其它cpp文件 ) #一定要包含main.cpp 包含的"*.h"文件 include_directories( ${PROJECT_SOURCE_DIR}/src/includes/ #${PROJECT_BINARY_DIR}/src/libs/ #${PROJECT_SOURCE_DIR}/src/libs/markup #${PROJECT_SOURCE_DIR}/src/modules/ #/opt/Ice/include ) #库文件路径 link_directories( /usr/local/lib #$ENV{ORACLE_HOME}/lib ) #添加自己生成的动态库/静态库 设置目标所需要的链接库 #link_libraries(myexe markup) link_libraries(main hellolib) add_executable(main ${myexe_EXEC_SRCS}) set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin/) #install(TARGETS main RUNTIME DESTINATION bin)
set(utils_LIB_SRCS hello.cpp #其它cpp文件 ) include_directories( ${PROJECT_SOURCE_DIR}/src/includes #${PROJECT_SOURCE_DIR}/src/libs/markup #${PROJECT_SOURCE_DIR}/src/libs ) link_directories( /usr/local/lib #其它库路径 ) #link_libraries(utils markup) #link_libraries(utils uuid) #生成动态库 静态库则 STATIC add_library (hellolib SHARED ${utils_LIB_SRCS}) set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/src/libs/)
有了上述基础,应该可以任意做自己的工程目录并且生成makefile拉。