set_target_properties 的作用是设置目标的属性,可以是目标文件输出的名称或者目录、目标文件的版本号。与之对应的,我们可以使用 get_target_properties 来获取目标文件某一属性对应的值。
命令格式如下:
set_target_properties(目标文件1 目标文件2 ...
PROPERTIES
属性1 属性值1 属性2 属性值2 ...)
下面仅列举出一些常见的属性,更多属性可以参考cmake官方文档:cmake-properties
目录
一、内置属性
1、更改目标文件的输出名称(OUTPUT_NAME)
2、设置版本号(VERSION)
3、将目标文件保存到指定目录下
4、指定Debug模式下目标文件名的后缀(DEBUG_POSTFIX)
二、自定义属性
1、为一个目标创造属性
2、一次为多个目标创造属性
三、获取属性
一、内置属性
1、更改目标文件的输出名称(OUTPUT_NAME)
命令格式:
SET_TARGET_PROPERTIES (<old_name> PROPERTIES OUTPUT_NAME <new_name>)
举例:
ADD_LIBRARY (hello SHARED ${LIBHELLO_SRC})
# 因为target不能同名,只能先生成一个临时的,然后更名
ADD_LIBRARY (hello_static STATIC ${LIBHELLO_SRC})
# 更改输出文件名
# 将 hello_static 更名为 hello
SET_TARGET_PROPERTIES (hello_static PROPERTIES OUTPUT_NAME "hello")
2、设置版本号(VERSION)
命令格式:
# VERSION: 一般指代动态库版本
# SOVERSION: 指代API版本
SET_TARGET_PROPERTIES (<target> PROPERTIES
VERSION <version_number>
SOVERSION <soversion_number>
)
举例:
SET_TARGET_PROPERTIES (hello PROPERTIES VERSION 1.2 SOVERSION 1)
3、将目标文件保存到指定目录下
目标文件可以大致分为三种类型:二进制执行文件、动态库、静态库。保存不同目标文件所用到的属性不一样。具体分类如下。
- RUNTIME_OUTPUT_DIRECTORY:二进制执行文件
- LIBRARY_OUTPUT_DIRECTORY:动态库
- ARCHIVE_OUTPUT_DIRECTORY:静态库
命令格式如下:
# <target> 需要安装的目标文件
# <folder_type> 属性类型
# <target_dir> 目标目录
SET_TARGET_PROPERTIES (<target> PROPERTIES <folder_type> <target_dir>)
以保存动态库为例:
# 将动态库 libhello.so 保存到 lib 目录下
# set_target_properties(hello PROPERTIES LIBRARY_OUTPUT_DIRECTORY "lib")
# 将目标文件保存到顶层CMakeLists.txt所处目录下的build/lib
set_target_properties(mul
PROPERTIES LIBRARY_OUTPUT_DIRECTORY
${PROJECT_SOURCE_DIR}/build/lib
)
4、指定Debug模式下目标文件名的后缀(DEBUG_POSTFIX)
为了区别不同模式下的不同文件,我们可以指定Debug模式下的目标文件名后缀为 _d,以用于区分 release 模式下生成的目标文件。
命令格式:
SET_TARGET_PROPERTIES (<target> PROPERTIES DEBUG_POSTFIX <suffix_name>)
举例:
# 指定debug模式下的目标文件名后缀为 _d,即如果是动态库文件,那就是 libhello_d.so
SET_TARGET_PROPERTIES (hello PROPERTIES DEBUG_POSTFIX _d)
二、自定义属性
set_target_properties除了可以设置已有的属性,还可以为目标文件创造属性,并赋值。
命令格式:
SET_TARGET_PROPERTIES (<target> PROPERTIES <custom_property_name> <value>)
1、为一个目标创造属性
add_library(test_lib SHARED ${ALL_SRCS})
# 为目标文件 test_lib 创造一个 _STATUS_ 属性,属性值为 shared
set_target_properties(test_lib PROPERTIES _STATUS_ shared)
# 获取 test_lib 的 _STATUS_ 属性并保存到 var
get_target_property(var test_lib _STATUS_)
message("===============================")
message("= test_lib的_STATUS_属性: ${var}")
message("===============================")
2、一次为多个目标创造属性
一次为多个目标创造属性遵从按顺序创建并赋值
add_library(test_lib SHARED ${ALL_SRCS})
add_library(test_lib_static STATIC ${ALL_SRCS})
# 为目标 test_lib 创建属性 _STATUS_ ,并赋值为 shared
# 为目标 test_lib_static 创建属性 _STATUS_STATIC_,并赋值为 static
set_target_properties(test_lib test_lib_static
PROPERTIES
_STATUS_ shared
_STATUS_STATIC_ static
)
get_target_property(var test_lib _STATUS_)
get_target_property(var_static test_lib_static _STATUS_STATIC_)
message("===============================")
message("= test_lib 的 _STATUS_ 属性: ${var}")
message("= test_lib_static的_STATUS_STATIC_属性: ${var_static}")
message("===============================")
三、获取属性
get_target_properties 可以获取到某个目标已有的属性对应的值,并保存到指定变量中。这个属性可以是内置的,也可以是自己创建的。
命令格式:
get_target_property(<variable> <target> <target_property>)
示例可以参考上面第二部分“自定义属性”。