> 文章列表 > 【cmake学习】set_target_properties 常见属性以及获取target 属性

【cmake学习】set_target_properties 常见属性以及获取target 属性

【cmake学习】set_target_properties 常见属性以及获取target 属性

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> PROPERTIESVERSION <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_staticPROPERTIES _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>)

示例可以参考上面第二部分“自定义属性”。