cmake 工具 三 add_libary, set_target_properties,link_libary, target_link_libary
创始人
2024-01-21 08:49:52

一起通过一个例子学一下  add_libary, set_target_properties,link_libary, target_link_libary 四个命令

首先创建如下的文件:

 其中 build用于cmake编译,防止大量编译的中间文件污染代码文件夹具体可见cmake 构建工具 一 hello world_kangshuangzhu的博客-CSDN博客

 int_plus 的作用就是两个数相加,int_con就是两个数相减,特别简单,这里不放代码了

add_libary 

生成动态库和静态库

add_library( [STATIC | SHARED | MODULE]

            [EXCLUDE_FROM_ALL]

            [source1] [source2 ...])

上面参数看着复杂,其实用的最多的也就三个:

1.  生成的库名

2.[STATIC | SHARED | MODULE] 库类型

STATIC  生成静态库

SHARED  生成动态库

MODULE  这个我没用过,网上看也几乎没有什么人用,晚些时间补上

应该注意的是这三个参数必须用大写

3. source 代码路径,也可以不指定,在后续target_sources() 中指定

add_libary和add_execute是唯二能够产生target的配置。target我的理解就是最终生成的编译结果。

我们来实践一下,CMakeLists.txt配置如下:

# cmake 最低版本需求
cmake_minimum_required(VERSION 3.13)# 工程名称
project(cmake_study1)# 设置
set(CMAKE_CXX_STANDARD 11)include_directories(src/include)
include_directories(src)
AUX_SOURCE_DIRECTORY(src/include INCLUDE)
AUX_SOURCE_DIRECTORY(src DIR_SRCS)
message(${INCLUDE})add_library(int_plus STATIC ${INCLUDE})add_executable(cmake_study ${DIR_SRCS} ${INCLUDE})

打开build文件夹, 输入

cmake..
make

 可以看到build文件夹下除了cmake_study使我们的编译目标意外,还生成了一个libint_plus.a的库文件。这就是生成的库文件,mac会在生成的库文件中自动加上lib前缀

同时我们打开CMakefiles,可以看到比没有使用add_libary的时候多了一个int_plus.dir。 这个文件夹的命名方法和cmake_study.dir类似,说明int_plus也走完了预编译,编译,汇编等过程,唯一和cmake_study不同的是,int_plus没有main函数,会生成一个库文件。

导入已经生成的库

add_library( IMPORTED [GLOBAL])

这个最常用的参数是2个

name:库名,可以自己随意起名字

  库类型,[STATIC | SHARED | MODULE]

应该注意的是,type 和  IMPORTED  都应该大写

如果要用导入的库,只用add_library( IMPORTED [GLOBAL]) 是不够的。首先我们不知道这个库的地址,而且也没有指定哪些代码依赖这个库。

指定库的地址 用set_target_properties 或者 set_properties(target) 来实现。两个命令直接看名字就知道是设置target的属性。set_properties(target)与set_target_properties 本质上没有区别,可以认为set_target_properties 是 set_properties 的一种特殊情况。target的属性多到令人发指具体可以看cmake-properties(7) — CMake 3.25.0-rc4 Documentation

这里只介绍路径

set_target_properties( PROPERTIES  IMPORTED_LOCATION  )

name  库名,和上面的库名对应

path    库文件的路径

还用刚才的例子,在项目中创建一个新文件夹叫lib,把刚刚生成的库文件放进lib中,清空build。形成如下的文件结构。

添加 CMakeLists.txt配置如下:

# cmake 最低版本需求
cmake_minimum_required(VERSION 3.13)# 工程名称
project(cmake_study1)# 设置
set(CMAKE_CXX_STANDARD 11)include_directories(src/include)
include_directories(src)
AUX_SOURCE_DIRECTORY(src/include INCLUDE)
AUX_SOURCE_DIRECTORY(src DIR_SRCS)
message(${INCLUDE})add_library(libint_plus STATIC IMPORTED )
set_target_properties(int_plus PROPERTIESIMPORTED_LOCATION ../lib/libint_plus.a
)# 编译源码生成目标
add_executable(cmake_study ${DIR_SRCS} ${INCLUDE})
target_link_libraries(cmake_study PRIVATE libint_plus)

在build中执行

cmake..
make

可以顺利编译。这里需要注意一点 

库文件的路径如果写相对路径,应该是以build文件夹为当前路径,而不是项目文件夹。

考虑一个问题,既然我们已经加载了INCLUDE 文件夹编译的库文件,那么是不是可以不再编译INCLUDE了?

add_executable(cmake_study ${DIR_SRCS} ${INCLUDE})

改成

add_executable(cmake_study ${DIR_SRCS} )

事实上这样确实是可以的。

以上用的是静态库,我们知道静态库会被包含进最终的可执行文件中,动态库则是在运行的时候调用。这里可以验证一下。把刚刚保存的静态库libint_plus.a 删除,输入命令运行可执行文件:

cmake_study

可以运行。

如果把上面的静态库换成动态库,把库文件删掉后则会报错。如果把可执行文件换一个路径,也会报错,因为可执行文件调用动态库是从可执行文件的路径通过相对路径调用,移动了位置以后就会找不到动态库的位置。

在上面的例子中,add_libary , set_target_properties, target_link_libaries在一起使用,他们各自起了什么作用呢?

实际上如果我们只添加配置

add_library(libint_plus STATIC IMPORTED)

set_target_properties(libint_plus PROPERTIES

IMPORTED_LOCATION ../lib/libint_plus.a

)

编译的时候是什么都不做的,我们在加上这一行以后,输入cmake ..   。然后生成的配置文件中搜索libint_plus, 什么都搜不到。这是因为我们只配置这两行,只是告诉cmake我们会使用这个库文件,但是没告诉它我们要在哪个程序中链接这个库文件,所以cmake实际上不会把他们放进编译配置中。

真正让库文件生效的是target_link_libary

target_link_libary

target_link_libary用于指定target的库链接

target_link_libraries( ...[ ...]...)

 其中

是编译目标,必须是add_libary或者add_executable的结果。

item是要连接的库,一个目标可以链接多个库

还是刚才的那个例子,我们在cmakefile.txt 中添加 

target_link_libraries(cmake_study libint_plus)

后,然后运行cmake .. 。可以发现最明显的区别就是在 build/CMakeFiles/cmake_study.dir/link.txt 中生成了一个配置

 说明link配置文件已经把库文件和最终的可执行程序建立了联系。

相关内容

热门资讯

长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
不用扬鞭自奋蹄 乘势而上千帆竞... 思明区正全力向“两个进位”目标发起冲刺,努力为建设高素质高颜值现代化国际化的厦门作出“思明贡献”。(...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
好听的民谣歌曲 2021最火的... #我的年度歌单#在2021年里听过很多民谣,但是最能触及心中温柔的还是下面的几首。不听民谣的理由有很...