CMakeLists代码分析

 1 cmake_minimum_required (VERSION 2.8)
 2 
 3 #指定项目的名称(CMAKE_PROJECT_NAME)
 4 #在cmake中有两个预定义变量:< projectname >_BINARY_DIR以及< projectname >_SOURCE_DIR
 5 
 6 project(NetLib)
 7 
 8 if(NOT CMAKE_BUILD_TYPE)
 9     set(CMAKE_BUILD_TYPE "Release")
10 endif()
11 
12 set(CMAKE_CXX_COMPILER "g++")
13 set(CMAKE_CXX_FLAGS "-std=c++11 -Wall")
14 set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
15 set(CMAKE_CXX_FLAGS_RELEASE "-O3")
16 
17 #PROJECT_SOURCE_DIR和PROJECT_BINARY_DIR
18 #内部构建情况下两个变量值相同。
19 #在外部构建的情况下,PROJECT_SOURCE_DIR指向的目录同内部构建相同,为CMakeList.txt所在的目录(假定为workDirectory),
20 #而PROJECT_BINARY_DIR则有所不同,指向workDirectory/build/release目录。(因为外部构建是在release文件夹里面调用cmake..)
21 
22 
23 #CMAKE_BUILD_TYPE=$BUILD_TYPE=release
24 message(STATUS "BUILD_TYPE: " ${CMAKE_BUILD_TYPE})
25 #这是一个转化为大写的命令,把CMAKE_BUILD_TYPE的值大写后写入BUILD_TYPE
26 string(TOUPPER ${CMAKE_BUILD_TYPE} BUILD_TYPE)
27 #CXXFLAGS = -std=c++11 -Wall -03,这是存放一些g++的后缀,std=c++11这是要包含的库
28 message(STATUS "CXXFLAGS: " ${CMAKE_CXX_FLAGS} " " ${CMAKE_CXX_FLAGS_${BUILD_TYPE}})
29 
30 #可以通过 SET 指令重新定义 EXECUTABLE_OUTPUT_PATH 和 LIBRARY_OUTPUT_PATH 变量来指定最终的目标二进制的位置
31 #PROJECT_BINARY_DIR=workDirectory/build/release
32 #库文件
33 set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
34 #可执行文件
35 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
36 
37 #INCLUDE_DIRECTORIES类似gcc中的编译参数“-I”,指定编译过程中编译器搜索头文件的路径
38 include_directories(${PROJECT_SOURCE_DIR}/src)
39 
40 #设定源文件和头文件就在这四个文件夹内
41 set(SRC_LIST "log" "base" "net" "http")
42 
43 foreach(SUB_DIR ${SRC_LIST})
44     #搜集在指定路径下的所有源文件的文件名,将输出结果列表储存在指定的变量(SUB_LIST)中。
45     aux_source_directory(src/${SUB_DIR} SUB_LIST)
46     #和add_executable类似,生成库文件,SHARED代表动态库,STATIC代表静态库, 最后一个参数代表此库的源文件列表,此指令只有三个参数
47     #这里是生成库,名字是NetLib_${SUB_DIR}
48     add_library(NetLib_${SUB_DIR} ${SUB_LIST})
49     #参数中的TARGETS后面跟的就是我们通过ADD_EXECUTABLE或者ADD_LIBRARY定义的目标文件,可能是可执行二进制、动态库、静态库。
50     #因为DESTINATION没有用绝对路径,所以用的是CMAKE_INSTALL_PREFIX,也就是release/../release-install/lib
51     #这里我们把库安装好,放到../release-install/lib里面去
52     install(TARGETS NetLib_${SUB_DIR} DESTINATION lib)
53     #DIRECTORY后面连接的是所在Source目录的相对路径,这里把所有的头文件都安装好
54     #install(FILES flie DESTINATION dir_path) #执行make install时,把file拷贝到dir_path
55     #这里把src/${SUB_DIR}的文件里面的.h文件都安装好,放在../release-install/include里面去
56     install(DIRECTORY src/${SUB_DIR}/ DESTINATION include FILES_MATCHING PATTERN "*.h")
57 endforeach()
58 
59 #target_link_libraries(target_name lib_name ...) 
60 #给目标添加依赖库,类似与gcc -l lib_name,此指令有两个用处,一个是给可执行target_name 添加库依赖,二是给库target_name 添加库依赖。
61 #这里相当于生成库文件名字是NetLib_base和NetLib_net,这里的库需要依赖pthread
62 target_link_libraries(NetLib_base pthread)
63 target_link_libraries(NetLib_net pthread)
64 
65 #项目最终编译生成的可执行文件名称则是由ADD_EXECUTABLE命令来指定的。
66 add_executable(main src/main.cc)
67 target_link_libraries(main NetLib_http pthread)
68 
69 #这是调用下面这两个目录里的cmakelist.txt
70 #用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置(由binary_dir指定)。
71 add_subdirectory(src/log/tests)
72 add_subdirectory(src/net/tests)

 

上一篇:虚拟机配置Clion调试ROS包


下一篇:Clion中使用VS 2017为编译环境配置dlib