cmake笔记

本文详细介绍了CMake的相关内容。包括策略CMP0005,确定add_definitions添加的预处理器定义值是否转义;命令list、macro、option、set、set_property的原型、解释和用法;还介绍了rpath相关设置,如CMAKE_SKIP_BUILD_RPATH等的作用及用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、策略

1、CMP0005 

二、命令  

1、list

2、macro 

3、option 

4、set

5、set_property

三、其他

1、rpath


一、策略

1、CMP0005 

解释:此策略确定CMake通过add_definitions添加的预处理器定义值,是否进行转义。OLD不转义。NEW此策略的新行为是自动为所有本机构建工具生成正确的转义。 策略是在CMake 2.6.0版中引入的。

用法:cmake_policy(SET CMP0005 OLD) 比如字符串不进行任何转义处理。

二、命令  

1、list

原型:

list(LENGTH <list> <output variable>)
list(GET <list> <element index> [<element index> ...] <output variable>)
list(APPEND <list> <element> [<element> ...])
list(FIND <list> <value> <output variable>)
list(INSERT <list> <element_index> <element> [<element> ...])
list(REMOVE_ITEM <list> <value> [<value> ...])
list(REMOVE_AT <list> <index> [<index> ...])
list(REMOVE_DUPLICATES <list>)
list(REVERSE <list>)
list(SORT <list>)

解释: 

       使用LENGTH选项时,该命令会返回给定list的长度。

  使用GET选项时,该命令返回list中所有被index索引的元素构成的list。

  使用APPEND选项时,该命令将会在该list之后追加若干元素。

  使用FIND选项时,该命令将返回list中指定的元素的索引;若果未找到,返回-1。

  使用INSERT选项时,该命令将在list中指定的位置插入若干元素。

  使用REMOVE_AT和REMOVE_ITEM选项将会从list中删除一些元素。它们之间的区别是:REMOVE_ITEM删除的是指定的项,而REMOVE_AT删除的是在指定索引处的项。

  使用REMOVE_DUPLICATES选项时,该命令将删除list中的重复项。

  使用REVERSE选项时,该命令将把list的内容就地前后倒换。

  使用SORT选项时,该命令将按字母序对list总的内容就地排序。

  注意:在CMake中,一个list是一个由封号;分割的一组字符串。使用set命令可以创建一个list。例如,set(var a b c d e)命令将会创建一个list:a;b;c;d;e;而set(var "a b c d e")命令创建的只是一个字符串,或者说是只有一个项的list。

  当使用指定索引的命令格式时,如果<element index>是大于等于0的数,<element index>是从list第一个项开始的序号,list的第一项的索引是0。如果<element index>小于等于-1,这个索引是从结尾开始的逆向索引,其中-1表示的是list的最后一项。当使用负数索引时,注意它们不是从0开始!-0与0等价,它指向list的第一个成员。

用法:

# set macro-directory
list(APPEND CMAKE_MODULE_PATH 
  "${CMAKE_SOURCE_DIR}/cmake/macros" 
  "${CMAKE_SOURCE_DIR}/dep/cotire/CMake")

2、macro 

原型

macro(<name> [arg1 [arg2 [arg3 ...]]])
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
endmacro(<name>)

解释:为后续以命令方式调用而开始记录一组宏。定义一个名为<name>的宏,它以arg1 arg2 arg3 (...)为参数。在macro命令之后,在与之配对的endmacro命令之前出现的命令,只有在宏被调用的时候才会被调用。当被调用的时候,这些被记录的命令首先以传进来的实参替换掉形参(如${arg1}),然后像正常的命令那样执行。除了形参之外,你还可以引用变量${ARGC},它表示传递到宏参数的数量。${ARG0}, ${ARG1}, ${ARG2} ...等等则是传进来的实参值。这些变量使得创建带可选参数的宏变得很便捷。此外,变量${ARGV}保留了所有传递到宏里的所有参数组成的一个list,变量${ARGN}保留了在最后一个形参之后的参数组成的一个list。注意:传递到宏内部的参数和值,比如ARGN不是CMake通常意义下的变量;它们只是字符串替换,这一点非常像C预处理器对C语言宏的处理过程。如果你想要用真正的CMake变量,你应该查看一下function命令的说明。

  macro和函数功能差不多,不知道macro相当于宏替换,argv参数列表传递过去,直接展开替换。而函数函数argv参数列表,参数变量可以被修改被影响。

用法:

macro(DisableIncrementalLinking variable)
  string(REGEX REPLACE "/INCREMENTAL *" "" ${variable} "${${variable}}")
  set(${variable} "${${variable}} /INCREMENTAL:NO")
endmacro()

3、option 

 原型:

option(<option_variable> "描述选项的帮助性文字" [initial value])

解释:为用户提供一个可选项。该命令为用户提供了一个在ON和OFF中做出选择的选项。如果没有指定初始值,将会使用OFF作为初值。如果有些选项依赖于其他选项的值,参见CMakeDependentOption模块的帮助文件。

用法:option(USE_COREPCH      "Use precompiled headers when compiling servers"              1) 

4、set

 原型:

set(<variable> <value> [[CACHE <type> <docstring> [FORCE]] | PARENT_SCOPE])

 解释:set将一个CMAKE变量设置为给定值。

将变量<variable>的值设置为<value>。在<variable>被设置之前,<value>会被展开。如果有CACHE选项,那么<variable>就会添加到cache中;这时<type>和<docstring>是必需的。<type>被CMake GUI用来选择一个窗口,让用户设置值。<type>可以是下述值中的一个:

(1)FILEPATH = 文件选择对话框。
(2)PATH = 路径选择对话框。
(3)STRING = 任意的字符串。
(4)BOOL = 布尔值选择复选框。
(5)INTERNAL = 不需要GUI输入端。(适用于永久保存的变量)。

  如果<type>是内部的(INTERNAL),那么<value>总是会被写入到cache中,并替换任何已经存在于cache中的值。如果它不是一个cache变量,那么这个变量总是会写入到当前的makefile中。FORCE选项将覆盖cache值,从而去掉任何用户带来的改变。

  如果指定了PARENT_SCOPE选项,变量<variable>将会被设置为当前作用域之上的作用域中。每一个新的路径或者函数都可以创建一个新作用域。该命令将会把一个变量的值设置到父路径或者调用函数中(或者任何类似的可用的情形中。)

  如果没有指定<value>,那么这个变量就会被撤销而不是被设置。另见:unset()命令。

用法:set(SCRIPTS "static" CACHE STRING "Build core with scripts")

5、set_property

原型:

set_property(<GLOBAL |
DIRECTORY [dir] |
TARGET [target1 [target2 ...]] |
SOURCE [src1 [src2 ...]] |
TEST [test1 [test2 ...]] |
CACHE [entry1 [entry2 ...]]>
[APPEND]
PROPERTY <name> [value1 [value2 ...]])

解释: 为作用域里的0个或多个对象设置一种属性。

第一个参数决定了属性可以影响到的作用域。它必须是下述值之一:

(1)GLOBAL,全局作用域,唯一,并且不接受名字。

(2)DIRECTORY,路径作用域,默认为当前路径,但是也可以用全路径或相对路径指定其他值。

(3)TARGET,目标作用域,可以命名0个或多个已有的目标。

(4)SOURCE,源作用域,可以命名0个或多个源文件。注意,源文件属性只对加到相同路径(CMakeLists.txt)中的目标是可见的。

(5)TEST 测试作用域可以命名0个或多个已有的测试。

(6)CACHE作用域必须指定0个或多个cache中已有的条目。

第二个参数PROPERTY选项是必须的,并且要紧跟在待设置的属性的后面。剩余的参数用来组成属性值,该属性值是一个以分号分隔的list。如果指定了APPEND选项,该list将会附加在已有的属性值之后。

用法:set_property(CACHE SCRIPTS PROPERTY STRINGS ${SCRIPTS_AVAILABLE_OPTIONS})

三、其他

1、rpath

解释:

CMAKE_SKIP_BUILD_RPATH:简单来说项目构建时,true跳过rpath,false先会先去rpath寻找

CAKE_BUILD_WITH_INSTALL_RPATH:简单来说跳过项目构建和安装时,true跳过rpath,false先会先去rpath寻找

CMAKE_INSTALL_RPATH_USE_LINK_PATH:简单来说跳过项目安装链接时,true跳过rpath,false先会先去rpath寻找

用法:

set(CMAKE_SKIP_BUILD_RPATH 0)

set(CMAKE_BUILD_WITH_INSTALL_RPATH 0)

set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")

set(CMAKE_INSTALL_RPATH_USE_LINK_PATH 1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值