cmake 要点总结
目录
警告
本文最后更新于 2019-12-17,文中内容可能已过时。
调试
通过 CMAKE_BUILD_TYPE 可以设置条件编译,执行生成可供调试的程序,这个相当于在命令行使用
|
|
|
|
头文件包含
include_directories(include_path)
可以使用 include_directories(include_path)
|
|
使用 find_
find_path: 要求找到文件所在路径find_library: 要求找到链接库find_package: 找到安装的链接库,包含以上两个。如果依赖包是非标准安装的,则需要执行以上两个命令进行查找。
以上命令执行后,可以生成
XXX_LIBRARY: 链接库XXX_INCLUDE_DIR: 相关的头文件
递归包含
当然,如果头文件的依赖关系比较复杂,上述方法则显得有点迂腐。我们可以写个简单的函数,通过递归寻找目标路径下的所有 .h 头文件
|
|
动态链接库
LINK_DIRECTORIES
TARGET_LINK_DIRECTORIES
常用变量
变量引用
使用 ${VAR_NAME} 获取变量值,但是在 IF 的语句中,是*直接使用变量名而不用通过 ${}*来识别的,原因是这些语句要求显示得到变量。
宏变量
PROJECT_SOURCE_DIR:最顶层CMakeLists.txt所在的目录PROJECT_BINARY_DIR:PROJECT_NAME:通过project(pro_name)定义得到的pro_nameCMAKE_SOURCE_DIRCMAKE_BINARY_DIR:执行cmake(通常实在 build)的当前目录CMAKE_CURRENT_SOURCE_DIR: 当前CMakeLists.txt所在目录EXECUTABLE_OUTPUT_PATH:设置最终编译得到的可执行目标文件的路径LIBRARY_OUTPUT_PATHCMAKE_C_FLAGSCMAKE_CXX_FLAGS
自定义变量
使用 set
后面可以直接引用变量
|
|
模糊匹配变量
把当前所有文件都命名为 DIR_SRCS
|
|
常用命令
CMAKE_MINIMUM_REQUIRED
PROJECT(pro_name)
INCLUDE(file.cmake)
包含某个 .cmake 文件。
INCLUDE_DIRECTORIES(path_name)
指定头文件路径,可以使用递归的方法包含文件夹下所有的头文件。
LINK_DIRECTORIES(path_name)
指定动态链接库的文件路径。
ADD_SUBDIRECTORY(path_name)
添加某个文件夹,实际上就是要求该文件夹下面存在 CMakeLists.txt,从而在执行 cmake的时候放入执行环境。
AUX_SOURCE_DIRECTORY(path_name DIR_NAME)
相当于把某个文件夹下面的所有文件合并存放为变量 DIR_NAME,从而方便后面引用。这个指令临时被用来自动构建源文件列表。因为目前cmake还不能自动发现新添加的源文件。
|
|
ADD_EXECUTABLE(hello main.cpp)
TARGET_LINK_LIBRARY
FIND 系列
FIND_系列指令主要包含一下指令:
FIND_FILE(<VAR> name1 path1 path2 ...):VAR变量代表找到的文件全路径,包含文件名FIND_LIBRARY(<VAR> name1 path1 path2 ...):VAR变量表示找到的库全路径,包含库文件名1 2 3 4 5## FIND_LIBRARY示例: FIND_LIBRARY(libX X11 /usr/lib) IF(NOT libX) MESSAGE(FATAL_ERROR “libX not found”) ENDIF(NOT libX)FIND_PATH(<VAR> name1 path1 path2 ...):VAR变量代表包含这个文件的路径。FIND_PROGRAM(<VAR> name1 path1 path2 ...):VAR变量代表包含这个程序的全路径。FIND_PACKAGE(<name> [major.minor] [QUIET] [NO_MODULE][[REQUIRED|COMPONENTS] [componets...]])1 2 3 4 5 6FIND_PACKAGE(HELLO) IF(HELLO_FOUND) ADD_EXECUTABLE(hello main.c) INCLUDE_DIRECTORIES(${HELLO_INCLUDE_DIR}) TARGET_LINK_LIBRARIES(hello ${HELLO_LIBRARY}) ENDIF(HELLO_FOUND)
IF
IF(expression_) 和 **ENDIF(expression_)**需要成对出现,而且 expression_ 内容要一样。
参考链接
相关内容
- makefile 将所有目录中的源文件编译成独立程序
- SublimeGDB: 更好用的轻量级 Debugger
- Unix Network Programming 代码学习
- Clion 远程调试
- K&R 读书笔记
支付宝
微信

william