一.常用语句/示例
1. cmake_minimum_required
(VERSION 2.8)
指明Cmake最低版本号要求
2. add_executable
(Demo main.cpp MathFunctions.cpp)
使用指定的源文件(.c .cpp .cc)来生成目标可执行文件
3. aux_source_directory
(<dir> <variable>)
查找目录下的所有源文件,并将名称保存到变量中
4. add_subdirectory
(<dir>)
指明本项目包含的子目录,则子目录下的 CMakeLists.txt 文件和源代码也会被处理
5. target_link_libraries
(Demo MathFunctions)
指明可执行文件需要连接一个名为 MathFunctions 的链接库
6. add_library
(MathFunctions ${DIR_LIB_SRCS})
将源文件编译为静态链接库
二.常用变量
- PROJECT_NAME
项目名 - CMAKE_PROJECT_VERSION
项目版本 - CMAKE_SOURCE_DIR
工程顶层目录 - CMAKE_CURRENT_SOURCE_DIR
当前处理的 CMakeLists.txt 所在的路径 - CMAKE_CURRENT_LIST_FILE
调用这个变量的 CMakeLists.txt 的完整路径 - CMAKE_PREFIX_PATH
find_package的一个将会进行搜索的路径子集 - CMAKE_INSTALL_PREFIX
执行install时的目标路径
三.常用语句模块
1. 选择面向 MSVC ABI 的编译器使用的 MSVC 运行时库
Release模式:
/MT 使用多线程静态链接运行时库
/MD 使用多线程动态链接运行时库
Debug模式:
/MTd 使用多线程静态链接运行时库
/MDd 使用多线程动态链接运行时库
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
2. 调用第三方库
可将第三方库所在路径加入CMAKE_PREFIX_PATH
变量,通常情况下第三方库将自定义<project_name>_FOUND (是否找到库文件), <project_name>_INCLUDE_DIR (头文件路径), <project_name>_LIBRARY (库文件所在路径)
find_package(LibName REQUIRED)
if(LibName_FOUND)
target_include_directories(main PRIVATE ${LibName_INCLUDE_DIR})
target_link_libraries(main ${LibName_LIBRARY})
endif(LibName_FOUND)
四.应用实例
1.项目结构

2.对应cmake项目结构

person下CmakeLists.txt编写方式:
cmake_minimum_required (VERSION 3.8)
aux_source_directory(. DIR_LIB_SRCS) #将当前目录下的源文件名传入DIR_LIB_SRCS
add_library(Person ${DIR_LIB_SRCS}) #将源文件编译为静态库(.lib),命名为Person
Demo下CmakeLists.txt编写方式:
cmake_minimum_required (VERSION 3.8)
aux_source_directory(. DIR_SRCS)
add_subdirectory(person) #添加子目录person,使得其下CMakeLists.txt能被解析
add_executable(demo ${DIR_SRCS}) #使用当前目录下的文件编译为可执行文件demo
target_link_libraries(demo Person) #链接person目录下的静态库Person.lib
注:以上方式为将子目录文件编译为静态库供main来进行调用的方式,也有其余写法,如利用 aux_source_directory 获取子目录源文件名,并添加到add_executable 内也可以执行
3.当使用find_package函数查找库的包含目录与库目录时需要知道由xxConfig.cmake或Findxx.cmake所定义的变量名以使用target_include_directories与target_link_libraries函数,则可以使用如下语句查看已定义的变量名(以jsoncpp为例):
get_directory_property(_vars_before VARIABLES)
find_package(JsonCpp)
get_directory_property(_vars VARIABLES)
list(REMOVE_ITEM _vars _vars_before ${_vars_before})
foreach(_var IN LISTS _vars)
message(STATUS "${_var} = ${${_var}}")
endforeach()
上述语句来源: 如何知道CMakeLists的库变量名?
Comment