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

https://blog.youkuaiyun.com/challenglistic/article/details/130130789

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、将目标文件保存到指定目录下
方式一:设置输出目录

我们可以设置动态库的保存目录,然后所有的动态库都会被保存到该目录下(静态库和二进制执行文件也是同理)。对应的属性如下

CMAKE_RUNTIME_OUTPUT_DIRECTORY:二进制执行文件的输出目录
CMAKE_LIBRARY_OUTPUT_DIRECTORY:动态库的输出目录
CMAKE_ARCHIVE_OUTPUT_DIRECTORY:静态库的输出目录
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib)        # 动态库
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/static)     # 静态库
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)        # 执行文件
方式二:指向性保存

同样是指定输出目录,但是不同的动态库文件指定不同的输出目录。(静态库和二进制执行文件也是同理)。目标文件可以大致分为三种类型:二进制执行文件、动态库、静态库。保存不同目标文件所用到的属性不一样。具体分类如下。

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>)
示例可以参考上面第二部分“自定义属性”。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.youkuaiyun.com/challenglistic/article/details/130130789

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值