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_name
CMAKE_SOURCE_DIR
CMAKE_BINARY_DIR
:执行cmake
(通常实在 build)的当前目录CMAKE_CURRENT_SOURCE_DIR
: 当前CMakeLists.txt
所在目录EXECUTABLE_OUTPUT_PATH
:设置最终编译得到的可执行目标文件的路径LIBRARY_OUTPUT_PATH
CMAKE_C_FLAGS
CMAKE_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 6
FIND_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 读书笔记
支付宝
微信