CMakeLists.txt常用语法
- cmake_minimum_required
- project
- add_executable
- include_directories
- add_library
- alias library(别名库)
- link_directories
- target_link_libraries
- link_libraries与target_link_libraries区别
- set直接设置变量的值
- set追加设置变量的值
- list追加或删除变量的值
参考文章
https://blog.csdn.net/weixin_43455581/article/details/107114241#t12
cmake_minimum_required
cmake_minimum_required(VERSION […<policy_max>] [FATAL_ERROR])
CMake中的命令cmake_minimum_required用于设定需要的最低版本的CMake。
例:
cmake_minimum_required(VERSION 3.10.2)
指定cmake编译的最低版本为3.10.2
project
project(fileName)
制定所间工程的名字,可以不写,一般要写且要和add_executable(fileName main.cpp)中第一个参数相同
即最终生成的目标可执行性文件名
add_executable
add_executable ( [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
[source1] [source2 …])
add_executable ( IMPORTED [GLOBAL])
add_executable ( ALIAS )
创建名为的target,这个target在make的时候会编译为可执行文件。编译的源文件为[source1] [source2]…。根据平台的不同,编译后的可执行文件名可能为.exe或者。
例:
add_executable(test main.cpp)
通main.cpp生成名为test的可执行性文件
参考:【https://blog.csdn.net/MacKendy/article/details/122549819】
include_directories
include_directories([`AFTER|BEFORE`] [`SYSTEM`] dir1 [dir2 ...])
将指定目录添加到编译器的头文件搜索路径之下,指定的目录被解释成当前源码路径的相对路径。
cmake使用 include_directories是用来 提供搜索头文件路径
cmake本身不提供任何搜索库的便捷方法,所有搜索库并给变量赋值的操作必须由cmake代码完成
比如,我现在想要#include"cv.h",但是这个cv.h的路径是/usr/local/include/opencv,那么我总不能在主函数头前写#include “/usr/local/include/opencv/cv.h”吧,这个时候就用到include_directories了,它提供了一个搜索头文件暂时的根目录
即你可以在cmakelists中写上include_directories(/usr/local/include)来让库文件搜索以/usr/local/include为基础,即在main函数前写上#include “opencv/cv.h"即可
例:
#CMakeList.txt
cmake_minimum_required(VERSION 3.13)
project(main)
include_directories(sub)
add_executable(main main.c)
//main.c
#include <stdio.h>
#include <test.h>
int main() {
printf("hello\n");
return 0;
}
如果在CMakeList.txt中不用include_directories(),make时就会出错,他会提示找不到test.h,如果加了他则会在sub目录下找test.h这个文件
当然,不使用include_directories(sub)
,在main.c中直接使用
#include “sub/test.h”`也是可以的。
参考:【https://www.jianshu.com/p/e7de3de1b0fa】
add_library
add_library(<name> [STATIC | SHARED | MODULE]
[EXCLUDE_FROM_ALL]
[source1] [source2] [...])
其中表示库文件的名字,该库文件会根据命令里列出的源文件来建立。而STATIC、SHARED和MODULE的做用是指定生成的库文件的类型。STATIC库是目标文件的归档文件,在连接其它目标的时候使用。SHARED库会被动态连接(动态连接库),在运行时会被加载。MODULE库是一种不会被连接到其它目标中的插件,可是可能会在运行时使用dlopen-系列的函数。默认状态下,库文件将会在于源文件目录树的构建目录树的位置被建立,该命令也会在这里被调用。
- 测试用例
add_library(sub src/sublib1.cpp)
说明: 当不指明库的类型时,生成静态sub。
- 测试用例
add_library(cmimpl SHARED ${CMIMPL_SOURCE_FILES})
add_library(cmjnidrv SHARED ${JNI_SOURCE_FILES}) # fctest指定了EXCLUDE_FROM_ALL 属性,不会自动编译,只能手动编译add_executable(fctest EXCLUDE_FROM_ALL FeatureCompareSpeedTest.cpp)
说明:加了EXCLUDE_FROM_ALL属性的target在默认编译时不会被编译,如果要编译,需要手动编译, 比如make fctest
指定编译名为fctest
alias library(别名库)
为给定library添加一个别名,后续可使用来替代。
add_library( ALIAS )
使用有如下限制:
不能是ALIAS
可用于判断target是否存在、链接。
ALIAS的library不能修改属性,不能调用set_property(), set_target_properties()和target_link_libraries()等方法
不能用于install()
link_directories
该指令的做用主要是指定要连接的库文件的路径,该指令有时候不必定须要。由于find_package和find_library指令能够获得库文件的绝对路径。不过你本身写的动态库文件放在本身新建的目录下时,能够用该指令指定该目录的路径以便工程可以找到。
target_link_libraries
target_link_libraries(main sub1 sub2)
第一个参数是最终生成的目标文件
后面的参数都是要链接的库的路径,以空格分割
该指令的做用为将目标文件与库文件进行连接。该指令的语法以下:
target_link_libraries(<target> [item1] [item2] [...]
[[debug|optimized|general] <item>] ...)
上述指令中的是指经过add_executable()和add_library()指令生成已经建立的目标文件。而[item]表示库文件没有后缀的名字。默认状况下,库依赖项是传递的。当这个目标连接到另外一个目标时,连接到这个目标的库也会出如今另外一个目标的链接线上。这个传递的接口存储在interface_link_libraries的目标属性中,能够经过设置该属性直接重写传递接口。
link_libraries与target_link_libraries区别
在cmake语法中,link_libraries和target_link_libraries是很重要的两个链接库的方式,虽然写法上很相似,但是功能上有很大区别:
1,link_libraries用在add_executable之前,target_link_libraries用在add_executable之后
2,link_libraries用来链接静态库,target_link_libraries用来链接导入库,即按照 file + .lib + .dll方式隐式调用动态库的.lib库
link_libraries(sub1 /home/ksx/HOME/dome5/build)
第一个参数为要链接的库的名字
第二个参数为要链接的库的全部路径/绝对路径(若该库在build下则可以不写路径,默认在build下找)
set直接设置变量的值
set(SRC_LIST main.cpp test.cpp)
add_executable(demo ${SRC_LIST})
set追加设置变量的值
set(SRC_LIST main.cpp)
set(SRC_LIST ${SRC_LIST} test.cpp)
add_executable(demo ${SRC_LIST})
list追加或删除变量的值
set(SRC_LIST main.cpp)
list(APPEND SRC_LIST test.cpp)
list(REMOVE_ITEM SRC_LIST main.cpp)
add_executable(demo ${SRC_LIST})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)