Cmake常用指令

2023-05-16

1、SET

SET(<variable><value> ... CACHE <type> <docstring> [FORCE])

将缓存条目variable设置为值<value>...,除非用户进行设置或者使用了选项FORCE,默认情况下缓存条目的值不会被覆盖。缓存条目可以通过CMAKE的GUI界面的add entry按钮来增加。缓存条目的实质为可以跨层级实现传递的变量,类似于全局变量。

缓存条目的<type>主要有以下几类:

BOOl

FILEPATH

STRING/STRINGS:文本行,CMAKE的GUI界面对此类缓存条目会提供一个文本框

INTERNAl:文本行,只用于内部,不对外呈现,主要用于运行过程中存储变量,因此使用该类意味着使用FORCE

缓存条目的几个注意事项:

1)如果变量先前未定义或者使用了FORCE选项,则缓存条目会被直接赋值

2)可以使用cmake的-D选项直接给缓存条目赋值,这样CMakeList.txt内的set命令只会为缓存条目添加类型。

3)如果变量类型为目录或者文件类型,通过-D选项传入的若只是相对路径,那么set会将相对路径变成绝对路径。

2、configure_file

configure_file指令通过读取文件中的内容,将CMakeLists.txt文件中的变量转为C/C++中可识别的宏定义,然后存入另外一个文件中。其语法格式如下。其中,input为输入的文件,output为输出的文件,其中,输入文件为xxx-config.h.in,输出文件为xxx-config.h

configure_file("${PROJECT_SOURCE_DIR}/versionInfo.rc.in" "${MY_VERSIONINFO}")

3、AUX_SOURCE_DIRECTORY

aux_source_directory(<dir> <variable>)

搜集所有在指定路径下的源文件的文件名,并将输出结果列表储存在指定的变量中。

# 查找当前目录下的所有源文件
# 并将名称保存到 SRC_LIST变量
aux_source_directory(. SRC_LIST)

add_executable(${TARGET} ${SRC_LIST})

不过这个方法也有它的缺点,就是把当前目录下的源文件都添加到变量SRC_LIST上了,并且只能检测目录下的cpp文件。如果我们不需要一些文件,可以进行这样操作:

set(SRC_LIST 
    ./main.c
    ./test1.c
    ./test2.c
    )

4、set_target_properties

set_target_properties(target1 target2 ...
                      PROPERTIES prop1 value1
                      prop2 value2 ...)

sets properties on targets.这句命令是列出所有你想要改变的目标,然后提供你想要设定的值。你可以使用任意你想要的属性值然后通过get_property()get_target_property()提取

SET_TARGET_PROPERTIES(${TARGET} PROPERTIES VERSION "${VERSION_FLAG}")
SET_TARGET_PROPERTIES(${TARGET} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${TARGET_BIN_OUTPUT_PATH}")

SET_TARGET_PROPERTIES(${TARGET} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY 
"${TARGET_OUTPUT_NAME}")

SET_TARGET_PROPERTIES(${TARGET} PROPERTIES FOLDER "${FOLDER_PATH}")

RUNTIME_OUTPUT_DIRECTORY:指明了运行时目标文件应该建立的位置

ARCHIVE_OUTPUT_DIRECTORY:指明了已经完成的目标文件应该建立的位置

FOLDER:设定文件夹名称。用来在IDE中组织目标,目标没有FOLDER属性将会出现在顶级目录。targets连上相同的FOLDER属性值将会出现在文件名相邻的两边。

5、TARGET_LINK_LIBRARIES

指明使用的库或者标志当链接到给定的目标或者他的依赖对象。

target_link_libraries(<target>...<item>...)

6、ADD_DEPENDENCIES

功能同target_link_libraries,但依赖库没有时,target_link_libraries会报错。用到的情况就是两个target有依赖关系并且依赖库也是通过编译源代码产生的,这时候可以通过add_dependencies在直接编译上层target时,自动检查下层依赖库是否已经生成。没有的话先编译下层依赖库,再编译上层target,最后link。


7、file指令

file(GLOB HEADERS "./*.h" "./*.hpp")
source_group("include" FILES ${HEADERS})

file指令可以包含所需要的文件 

8、add_definitions命令

add_definitions(-DFOO -DBAR)

//用于添加编译器命令行标志(选项),通常情况下我们使用其来添加预处理器定义

参考:

target_link_libraries — CMake 3.22.6 Documentation

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cmake常用指令 的相关文章

随机推荐