cmake 工具 三 add_libary, set_target_properties,link_libary, target_link_libary

news2025/7/4 21:27:07

一起通过一个例子学一下  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(<name> [STATIC | SHARED | MODULE]

            [EXCLUDE_FROM_ALL]

            [source1] [source2 ...])

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

1.<name>  生成的库名

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(<name> <type> IMPORTED [GLOBAL])

这个最常用的参数是2个

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

<type>  库类型,[STATIC | SHARED | MODULE]

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

如果要用导入的库,只用add_library(<name> <type> 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(<name> PROPERTIES  IMPORTED_LOCATION  <path>)

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 PROPERTIES
    IMPORTED_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(<target>
                      <PRIVATE|PUBLIC|INTERFACE> <item>...
                     [<PRIVATE|PUBLIC|INTERFACE> <item>...]...)

 其中

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

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

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

target_link_libraries(cmake_study libint_plus)

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/7414.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

手机端宝贝描述中每张图片的宽要在480到1500之间,最大高度为2500, 以下图片不满足

上图是近期小编与一位店主的聊天截图&#xff0c;从截图中我们可以知道&#xff0c;这位店主在使用复制软件来复制宝贝上传时出现了一些问题&#xff0c;下面&#xff0c;小编将上传出现的错误、分析过程及解决方法列示如下&#xff0c;希望能给其他店主一些帮助&#xff1a;查…

批量图片压缩怎么做?分享三招图片压缩怎么操作的方法

因为工作需要在电脑上保存大量图片的小伙伴们&#xff0c;是不是图片一下子把电脑内存占满了&#xff0c;可是要怎么做才能减少图片的占用空间呢&#xff1f;我们可以把图片压缩&#xff0c;这样子就可以保存更多的图片啦。还不清楚批量图片压缩怎么做的小伙伴们&#xff0c;让…

光点数据中台,解决高校信息整合难题_光点科技

目前&#xff0c;国家和相关部门对教育信息化高度重视&#xff0c;先后出台了多项政策和文件&#xff0c;要求加快教育信息化的发展步伐&#xff0c;高校信息化进入了快速发展期。 在此背景下&#xff0c;数据也将会成为高校信息化的核心资产&#xff0c;并对高校信息化的快速发…

【Big Data】解决Hive查询出现Java.lang.OutMemoryError.java heap space

一、Introduction 在使用Hive时&#xff0c;出现了以下的问题 错误的原因是资源分配不够&#xff0c;但是错误的原因有很多&#xff0c;需要去查看日志文件观察具体的错误。 日志文件位置在 /tmp/root/hive.log 由此我们知道具体的错误原因是JVM资源分配不够 接下来可以尝试…

PE格式:手写PE结构解析工具

PE格式是 Windows下最常用的可执行文件格式,理解PE文件格式不仅可以了解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如文件加密与解密,病毒分析,外挂技术等,在PE文件中我们最需要关注,PE结构,导入表,…

Tech Lead如何组建你的全明星团队

当你成为 Tech lead&#xff0c;意味着你不再只是团队中的普通一员。现在你是开发团队的Leader&#xff0c;换句话讲&#xff0c;这是一支你的团队。你需要费尽心思组建和打造你的团队&#xff01; 组建搭配合理的团队 (图片来自于 pixabay) 作为Tech Lead&#xff0c;你要先…

Jmeter,将响应结果保存至csv文件,并读取csv文件

在做性能测试的时候&#xff0c;需要模拟多个不同的用户同时进行操作&#xff0c;此时可以将响应数据中的某些字段&#xff08;比如token字段&#xff09;提取出来&#xff0c;以供下一接口作为入参。 一、将响应结果中的字段提取&#xff0c;并保存至CSV文件【分为2个步骤】 …

Redis管理客户端,兼容Windows、Mac、Linux

真正的大师,永远都怀着一颗学徒的心&#xff01; 一、项目简介 Redis管理客户端&#xff0c;兼容Windows、Mac、Linux 二、实现功能 支持自定义文本视图 支持哨兵支持 Hash List Set Zset搜索支持 支持自动更新 支持SSH 通道支持 支持精确搜索 单链接支持 支持Redis&g…

外观(门面)模式

思考外观模式 正常完成一个功能需要调很多个接口&#xff0c;外观模式就是组装这些接口为一个接口&#xff0c;对外提供这一个接口&#xff0c;用户调用这一个接口就能完成原来多个接口才能完成的功能&#xff0c;简化调用 1&#xff0e;外观模式的本质 外观模式的本质是:封装交…

用户管理系统(1)

1)用户管理项目:基本功能介绍 1)登录功能:只能是超级管理员管理员登录&#xff0c;普通用户无法进行登录 2)用户的列表页面:普通用户的列表页和超级管理员的列表页 3)条件查询:组合条件查询&#xff0c;不定规则的查询&#xff0c;指定名称&#xff0c;指定籍贯&#xff0c;指定…

相控阵天线(二):非规则线阵(稀布阵列、稀疏阵列、平方率分布阵列)

概述 非规则线阵主要包括以下情况&#xff1a; 1. 不均匀间距阵列&#xff1a; a&#xff09;不均匀间距递变阵列&#xff1a;单元间距按照一定的系数递增&#xff1b; b&#xff09;稀布阵列&#xff1a;阵元间隔不是固定的&#xff0c;没有规律&#xff1b; c&#xff09;稀…

广州蓝景分享—「JavaScript」this关键字的五个重要事项

首先this 关键字是 JavaScript 中最令人困惑的部分之一&#xff0c;今天通过介绍有关它的五个重要事项来阐明其目的和用法。 1、它允许访问同一对象上的其他属性 在 JavaScript 中&#xff0c;函数可以是独立的单元&#xff0c;但它们也可以用作对象的值。 考虑下一个对象。 …

SpringFramework:循环依赖与三级缓存

循环依赖与三级缓存 文章目录循环依赖与三级缓存一、Spring 中的循环依赖问题1. Spring 中的循环依赖概述2. Spring 中的循环依赖的 5 种场景二、Spring 三级缓存1. spring 创建 bean 的流程2. 场景一&#xff1a;单例的 setter 注入3. 三级缓存4. 关于二级缓存三、循环依赖的其…

ELFK——ELK结合filebeat日志分析系统(2)

目录 一、filebeat 二、ELFK 1.原理简介 2.在ELK基础上部署filebeat ​​​​​​ELK 企业级日志分析系统&#xff08;1&#xff09;_Evens7xxX的博客-CSDN博客 紧接上一期&#xff0c;这期会介绍ELK结合filebeat的部署和使用 一、filebeat Filebeat&#xff0c;轻量级的…

Word编辑论文,实现1.题目、摘要、关键词为通栏,正文为双栏 2.首页底端添加通栏脚注,在脚注中写作者简介,并使其实现悬挂对齐效果

Q1. 如何使题目、摘要、关键词为通栏&#xff0c;而下面开始的正文为双栏&#xff1f; 将光标移动到最后一个关键词后 布局—分隔符—分节符&#xff08;连续&#xff09; 将光标移动到正文第一个大标题前 布局—页面设置—文档网格—文字排列—栏数设置为 2&#xff0c;操作…

Python如何爬取免费爬虫ip

做过大数据抓取的程序员应该都知道&#xff0c;正常市面上的爬虫ip只分为两种&#xff0c;一种是API提取式的&#xff0c;还有一种是账密形式隧道模式的。往往因为高昂费用而止步。对于初学者觉得没有必要&#xff0c;我们知道每个卖爬虫ip的网站有的提供了免费IP&#xff0c;可…

基于CentOS使用宝塔+Nginx搭建个人小H站

本文目录前言第一步 - 购置服务器第二步 - 连接服务器第三步 - 安装宝塔第四步 - 部署网站总结前言 最近心血来潮&#xff0c;恰逢帅地老哥在公众号搞活动&#xff0c;白嫖了一台服务器&#xff0c;于是打算搭一个小网站玩玩。其实早有此念头&#xff0c;只是因为懒(●ˇ∀ˇ●…

项目实战——实现注册和登录模块

目录 一、整体框架 二、实现JwtToken验证 1、添加依赖 2、编写、修改相关类 三、实现后端 API 四、实现前端的登录&#xff0c;注册界面 ps&#xff1a;本篇文章篇幅较长&#xff0c;且难度有所提升&#xff0c;希望大家耐心看完&#xff0c;种一棵树最好的时间是十年前&…

ヾ(⌐ ■_■)— HTML-CSS常用属性

目 录 1.文字的设置 (1)文字的基本属性&#xff08;font&#xff09; (2)文字的排版以及添加文字的修饰 2.颜色的设置 3.背景的设置&#xff08;background&#xff09; 4.边框的相关设置 (1)边框样式的设置&#xff08;border-style&#xff09; (2)边框宽度的设置…

操作系统4小时速成:操作系统发展和分类,运行环境:运行机制和内核,用户态非特权,核心态特权,中断技术,访管指令

操作系统4小时速成&#xff1a;操作系统发展和分类&#xff0c;运行环境&#xff1a;运行机制和内核&#xff0c;用户态非特权&#xff0c;核心态特权&#xff0c;中断技术&#xff0c;访管指令 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂…