CMake
文件名格式和用法
- cmake文件的文件名必须是CMakeLists.txt,文件名大小写相关,如果一个工工程中有多个目录,每个目录中都必须有一个CMakeLists.txt文件
语法
示例代码一
编写CMakeLists.txt
cmake_minimum_required(version 2.8) # 版本号
project(HELLO) # 工程名
set(CMAKE_BUILD_TYPE "Debug") # debug调试
set(SRC_LIST main.c) # 使用SRC_LIST存储源文件,可以有多个
add_executable(hello ${SRC_LIST})
set (SRC_LIST # 使用set给变量存储多个源文件
./main.c
./text.cpp)
- cmake_minimum_required(version 2.8) ,要求必须写出cmake的最低版本号
- PROJECT(工程名称 [支持语言]),支持语言是可选参数,如果不写默认是所有需要都支持
- set(CMAKE_BUILD_TYPE “Debug”),设置debug版本,添加这一行就可以进行设断点调试
- SET(变量名 源文件),可以有一个或多个源文件
- ADD_EXETABLE(filename {变量名}方式取值,在IF( if )控制语句中,也可以直接使用变量名
运行cmake文件
- 在CMakeLists.txt所在目录下运行cmake.(.表示当前目录),系统自动生成CMakeFiles,CMakeCache.txt,cmake_install.cmake等文件,最主要的是生成Makefile,然后在当前目录中输入make命令,我们需要的可执行的目标文件hello就构建完成,然后./hello得到运行结果
运行结果
执行cmake 命令,输出如下图:
查看当前目录。会看到cmake生成的中间文件,以及最重要的Makefile文件
然后make开始编译,生成可执行文件,查看当前目录会看到可执行文件hello
示例代码二
当需要编译的源文件过多,如果都添加到set中会比较麻烦,cmake使用一种更简便的方式,使用aux_source_directory(dir var)来定义源文件列表
编写CMakeLists.txt
cmake_minimum_required(version 2.8) # 必须有的版本号
project(HELLO) # 工程名
set(CMAKE_BUILD_TYPE "Debug") # 添加debug版本
aux_source_directory(.SRC_LIST) # 定义变量,存储当前目录中所有源文件
add_executable(main ${SRC_LIST})
其他和示例一都是一样的,但是使用aux_source_directory会存在一些弊端,它会将当前目录中所有源文件都加进来,也许有一些源文件我们并不需要
示例三:一个完整的工程构建
一个完整的工程必须有的目录
-bin 存放最终的可执行文件
-build 存放编译中间文件
-lib 生成的.so库
-test 测试用例
-thirdparty 使用的三方库
-include 头文件
--text.h
--myadd.h
-src 源代码文件
--text.cpp
--myadd.cpp
-CMakeLists.txt
编写最外层的CMakeLists.txt
cmake_minimum_required(version 2.8) # 必须有的版本号
project(project) # 工程名
add_subdirectory(test) # 进入到test子目录的Cmake文件
add_subdirectory(src) # 进入到src子目录的Cmake文件
add_subdirectory(thiedparty) # 进入到thirdparty子目录的人Cmake文件
src目录的CMakeLists.txt
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib}) # 指定生成的库存放的位置
add_library(sum SHARED sum.cpp) # 指定生成库的源文件,SHARED是动态库,不加SHARED就是静态库
test目录的CMakeLists.txt
set(EXECUTABLE_OUTPT_PATH ${PROJECT_SOURCE_DIR}/bin) # 将编译的可执行文件存放工程根目录下的bin下
include_directories(${PROJECT_SOURCE_DIR}/include) # 头文件的搜索路径
link_direxctories(${PROJECT_SOURCE_DIR}/lib) # 库文件搜索路径
add_executable(main main.cpp) # 指定编译的文件以及生成的可执行文件名
target_link_libraries(main pthread) # 添加执行文件需要依赖的库
编译命令和上面的一样
CMake常用的预定义命令
PROJECT_NAME # 通过project()指定项目名称
PROJECT_SOURCE_DIR # 工程根目录
PROJECT_BINARY_DIR # 执行cmake命令的目录
EXESUTABLE_OUTPUT_PATH # 二进制可执行文件的输出位置
LIBRARY_OUTPUT_PATH # 库文件输出路径
附上自己写过项目的Cmake文件,供大家参考
项目根目录以及根目录的cmake文件
src目录以及Cmake文件
test目录以及Cmake文件