文章目录
-
- CMake常用语法
-
- PROJECT 定义工程名称
- SET 定义变量
- MESSAGE 输出信息
- ADD_EXECUTABLE 定义可执行文件
- INCLUDE_DIRECTORIES 添加头文件路径
- LINK_DIRECTORIES 添加库的路径
- TARGET_LINK_LIBRARIES 为target添加共享库
- INSTALL 安装指令
- 配置CMAKE环境变量
- ADD_DEFINITIONS
- ADD_DEPENDENCIES
- ADD_EXECUTABLE
- ADD_LIBRARY
- SET_TARGET_PROPERTIES
- GET_TARGET_PROPERTY
- ADD_TEST 与 ENABLE_TESTING 指令。
- AUX_SOURCE_DIRECTORY
- CMAKE_MINIMUM_REQUIRED
- EXEC_PROGRAM
- FILE 指令
- INCLUDE 指令
- FIND_系列指令
- math 数学运算
CMake常用语法
PROJECT 定义工程名称
PROJECT(projectname [CXX] [C] [Java])
你可以用这个指令定义工程名称,并可指定工程支持的语言,支持的语言列表是可以忽略的,
默认情况表示支持所有语言。这个指令隐式的定义了两个 cmake 变量:
_BINARY_DIR 以及_SOURCE_DIR,例如上一节中使用到的
HELLO_BINARY_DIR 和 HELLO_SOURCE_DIR就是这样隐式定义的。
同时 cmake 系统也帮助我们预定义了 PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR
变量,他们的值分别跟 HELLO_BINARY_DIR 与 HELLO_SOURCE_DIR 一致。
SET 定义变量
SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]])
现阶段,你只需要了解 SET 指令可以用来显式的定义变量即可。
比如我们用到的是 SET(SOURCE main.c),如果有多个源文件,也可以定义成:
SET(SOURCE main.c test1.c test2.c)。
MESSAGE 输出信息
MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display"
...)
这个指令用于向终端输出用户定义的信息,包含了三种类型:SEND_ERROR,产生错误,生成过程被跳过。
SATUS,输出前缀为—的信息。FATAL_ERROR,立即终止所有 cmake 过程
ADD_EXECUTABLE 定义可执行文件
ADD_EXECUTABLE(Hello ${SOURCE})
定义了这个工程会生成一个文件名为Hello的可执行文件,相关的源文件是SOURCE中
定义的源文件列表, 你也可以直接写成ADD_EXECUTABLE(Hello main.cpp)。
INCLUDE_DIRECTORIES 添加头文件路径
INCLUDE_DIRECTORIES,其完整语法为:
INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)
这条指令可以用来向工程添加多个特定的头文件搜索路径,路径之间用空格分割,如果路径
中包含了空格,可以使用双引号将它括起来,默认的行为是追加到当前的头文件搜索路径的
后面,你可以通过两种方式来进行控制搜索路径添加的方式:
1,CMAKE_INCLUDE_DIRECTORIES_BEFORE,通过 SET 这个 cmake 变量为 on,可以
将添加的头文件搜索路径放在已有路径的前面。
2,通过 AFTER 或者 BEFORE 参数,也可以控制是追加还是置前。
LINK_DIRECTORIES 添加库的路径
LINK_DIRECTORIES(directory1 directory2 ...)
这个指令非常简单,添加非标准的共享库搜索路径,比如,在工程内部同时存在共享库和可
执行二进制,在编译时就需要指定一下这些共享库的路径。
TARGET_LINK_LIBRARIES 为target添加共享库
TARGET_LINK_LIBRARIES 的全部语法是:
TARGET_LINK_LIBRARIES(target library1
<debug | optimized> library2
...)
这个指令可以用来为 target 添加需要链接的共享库,可以用于为自己编写的共享库添加共享库链接。
共享库的名称写法有多种,以下写法均是可以的:
TARGET_LINK_LIBRARIES(project utils) # 连接libhello.so库,默认优先链接动态库
TARGET_LINK_LIBRARIES(project libutils.a) # 显示指定链接静态库
TARGET_LINK_LIBRARIES(project libutils.so) # 显示指定链接动态库
TARGET_LINK_LIBRARIES(project -lutils)
e.g:
# 指定库的位置为项目根目录下的lib目录
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib_utils/lib)
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/lib_utils/include)
TARGET_LINK_LIBRARIES(${PROJECT_NAME} utils)
INSTALL 安装指令
INSTALL 指令用于定义安装规则,安装的内容可以包括目标二进制、动态库、静态库以及文件、目录、脚本等。
提到INSTALL就不得不提一下CMAKE_INSTALL_PREFIX变量,类似于 configure 脚本的 –prefix,用于指定安装的位置,默认位置是/usr/local/,不同的系统默认位置可能不一样,常见的使用方法看
起来是这个样子:
cmake -DCMAKE_INSTALL_PREFIX=/usr .
INSTALL 指令包含了各种安装类型,我们需要一个个分开解释:
目标文件的安装:
INSTALL(TARGETS targets...
[[ARCHIVE|LIBRARY|RUNTIME]
[DESTINATION <dir>]
[PERMISSIONS permissions...]
[CONF