当前位置: 首页 > news >正文

CMake教程6:调用lib、dll

之前我们学到了如何编写一个可执行程序和Library,在继续学习之前,需要解释下target,在cmake中我们可以给executablelibrary设置一个target名字,这样可以方便我们在后续对target进行更加详细的属性设置。

本节我们将学习如何在项目中引用lib,相关的api有:

 

makefile

复制代码

link_libraries(<item>... ...) # item链接到所有目标中 target_link_libraries(<target> ... <item>... ...) # 将item链接到指定的target中

其中item参数支持的情况比较多,提前介绍几种情况:

  • lib name:提供库的名字,让cmake去查找对应的库文件绝对路径
  • lib fullpath:直接一步到位给出库文件的绝对路径
  • target name: 根据target的属性,让cmake查找对应库文件的绝对路径

target_xxx的命令颗粒度更细,是比较高版本的命令。

app调用有源代码的lib

这种情况是有lib的源代码,我们将lib以源代码的方式链接到项目内

项目结构为:

  • main.cpp
  • lib.cpp
  • CMakeLists.txt
 

makefile

复制代码

# app cmake_minimum_required(VERSION 3.0.0) set(app "demo") project(${app} VERSION 0.1.0) add_executable(${app} main.cpp) # lib set(lib "my-lib") project(${lib}) add_library(${lib} ./lib.cpp) # 将lib链接到app target_link_libraries(${app} ${lib})

需要注意的target_link_libraries

  • 第一个target参数来自add_executable的第一个参数
  • 后续item参数来自add_library的第一个参数

app调用第三方lib、dll

这种情况是我们使用第三方的lib,只有头文件和库文件(.a、.dll、*.so

方式1:imported-libraries

 

bash

复制代码

# 设置target名字为dll,并且是一个外部导入的lib # GLOBAL选项可以将target的作用域变为全局,默认是只在目录内可见 add_library(dll SHARED IMPORTED GLOBAL) # 设置target dll的详细属性,dll/lib 不区分debug/release的情况 set_target_properties(dll PROPERTIES # 指向lib,windows必须设置此项 IMPORTED_IMPLIB ${CMAKE_CURRENT_LIST_DIR}/dll.lib # 指向dll、so等 IMPORTED_LOCATION ${CMAKE_CURRENT_LIST_DIR}/dll.dll ) # 设置debug/release set_target_properties(dll PROPERTIES IMPORTED_IMPLIB_DEBUG ${CMAKE_CURRENT_LIST_DIR}/dll_debug.lib IMPORTED_IMPLIB_RELEASE ${CMAKE_CURRENT_LIST_DIR}/dll_release.lib IMPORTED_LOCATION_DEBUG ${CMAKE_CURRENT_LIST_DIR}/dll_debug.dll IMPORTED_LOCATION_RELEASE ${CMAKE_CURRENT_LIST_DIR}/dll_release.dll ) target_link_libraries(app dll)

这里我们使用的是set_target_properties,可以同时给多个target设置多个不同的属性:

 

scss

复制代码

set_target_properties( target1 target2 ... PROPERTIES prop1 value1 prop2 value2 ... )

方式2:将指定的库文件直接链接到target的不同配置

 

bash

复制代码

target_link_libraries(${target} debug ${debug_fullpath}) target_link_libraries(${target} optimized ${release_fullpath})

这两种方式都可以,原因是target_link_libraries的item参数既可以是target name,也可以是lib fullpath

在xcode中,对应的工程配置为:

  • 当为target name时,出现在command的args中

    image.png

  • 当为lib fullpath时,在xcode中的位置在Linking/Others Linker Flags:

    image.png

无论使用哪种方式,注意dll、lib必须是存在的,底层查找lib时,不会自动补充lib前缀。

include头文件目录问题

以上仅仅是告诉编译器lib文件的位置在哪里,我们需要添加头文件目录,编译器才能识别到lib api

方式1:直接添加头文件目录,缺点是要手动把使用到的lib include path一个一个加进去,比较麻烦

 

bash

复制代码

# 注意:要放在add_executable、add_library前边才有效 include_directories("a/b/c/")

方式2:给lib target中添加,只要项目依赖了这个target,就会自动将目录添加到项目中

 

makefile

复制代码

# 注意:要放在add_library后边才有效 target_include_directories(lib INTERFACE # 权限控制,类比:public/private/protected ${CMAKE_CURRENT_SOURCE_DIR}/ )

方式3:和方式2没啥区别,写法不同而已

 

makefile

复制代码

set_property(TARGET lib PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_LIST_DIR} )

推荐使用第2种方式。

lib包含目录问题

这种情况对应的是我们target_link_libraries的item参数是lib name,为了让CMake可以通过lib name找到对应的lib文件 ,所以我们才需要设置库包含目录,如果item参数是lib pathtarget name,则不需要设置库包含目录。

相关的命令有link_directoriestarget_link_directories,区别参考上文。

作者:xu__yanfeng
链接:https://juejin.cn/post/7157618014311940126
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章:

CMake教程6:调用lib、dll

之前我们学到了如何编写一个可执行程序和Library&#xff0c;在继续学习之前&#xff0c;需要解释下target&#xff0c;在cmake中我们可以给executable和library设置一个target名字&#xff0c;这样可以方便我们在后续对target进行更加详细的属性设置。 本节我们将学习如何在项…...

行业资讯丨“燃气智慧化”到底是什么?

文章来源&#xff1a;网络 关键词&#xff1a;智慧燃气、智慧燃气场站、设备设施数字化、数字孪生、工业互联网 带你了解燃气信息化 随着科技的不断进步和信息化的快速发展&#xff0c;各行各业都在积极探索如何将技术应用于业务中&#xff0c;以提高效率和服务质量。 燃气…...

angular注入方法providers

在Angular中有很多方式可以将服务类注册到注入器中: Injectable 元数据中的providedIn属性 NgModule 元数据中的 providers属性 Component 元数据中的 providers属性 创建一个文件名叫名 hero.service.ts叫 hero 的服务 hero.service.ts import { Injectable } from angular…...

Git提交规范指南

在开发过程中&#xff0c;Git每次提交代码&#xff0c;都需要写Commit message&#xff08;提交说明&#xff09;&#xff0c;规范的Commit message有很多好处&#xff1a; 方便快速浏览查找&#xff0c;回溯之前的工作内容可以直接从commit 生成Change log(发布时用于说明版本…...

QT之UDP通信

QT之UDP通信 UDP不分客户端口服务器,只需要使用一个类QUdpSocket QT += core gui networkgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = udp TEMPLATE = app# The following define makes your compiler emit warnings if you use # any feature of Qt …...

一、进入sql环境,以及sql的查询、新建、删除、使用

1、进入sql环境 》》》mysql -u root -p 》》》输入密码 2、sql语言的分类 3、注意事项&#xff1a; 4、基础操作&#xff1a; &#xff08;1&#xff09;查询所有数据库&#xff1a; show databases; 运行结果&#xff1a; &#xff08;2&#xff09;创建一个新的数据库&…...

向日葵如何截图

场景 向日葵远程时&#xff0c;有时需要截图&#xff0c;但是客户电脑上没有qq、微信等软件提供快捷截图。 怎么办呢? 解决方案 其实向日葵肯定支持这些功能的。 设置 | 热键设置 | 勾选 远控其他设备时&#xff0c;可输入热键进行以下操作。 如果&#xff1a; altq 切换…...

固定资产折旧报表

SELECT * FROM SYS_ORGANIZATION -- OID、OCODE、ONAME、OATTRIBUT、FPC_USE_UNITNAME -- IS_DELETE 0 STATUS 1 SELECT * FROM FA_PROPERTY_CARD -- FPC_MANAGE_UNIT、FPC_ZJLY、FPC_ZJLYNAME、FPC_RESOURCE、FPC_MON_ZJE、FPC_SUMZJ、FPC_J…...

ubuntu18 下更改 mysql 数据目录

一、修改步骤 更改 MySQL 的数据目录需要注意以下几个步骤&#xff1a; 停止 MySQL 服务 在 Ubuntu 中&#xff0c;你可以使用以下命令停止 MySQL 服务&#xff1a; sudo systemctl stop mysql 复制现有数据 假设你的新的数据目录是 /new/dir/mysql&#xff0c;你应该使用 rsy…...

Arduino看门狗定时器WDT

Arduino - 看门狗定时器&#xff08;WDT&#xff1a;Watch Dog Timer&#xff09; 参考 看门狗定时器&#xff08;WDT&#xff1a;Watch Dog Timer&#xff09;实际上是一个计数器。 一般给看门狗一个大数&#xff0c;程序开始运行后看门狗开始倒计数。 如果程序运行正常&…...

大数据岗位秋招面试八股文总结(不定时更新)

HIVE面试题 内部表和外部表的区别 未被external修饰的是内部表&#xff0c;被external修饰的是外部表&#xff1b; 内部表数据由Hive自身管理&#xff0c;外部表由HDFS管理&#xff1b; 删除内部表会直接删除元数据及存储数据&#xff0c;删除外部表&#xff0c;仅仅会删除…...

MATLAB高分辨率图片

把背景调黑&#xff0c;把曲线调黄&#xff0c;把grid调白&#xff0c;调调字体字号的操作 close all a0:0.1:10; noise2*rand(1,length(a)); bsin(a)sin(3*a)noise;plot(a,b,y,linewidth,2); ylim([-3 4]) %y轴范围 set(gca,xgrid,on,ygrid,on,gridlinestyle,-,Grid…...

Spring Clould 消息队列 - RabbitMQ

视频地址&#xff1a;微服务&#xff08;SpringCloudRabbitMQDockerRedis搜索分布式&#xff09; 初识MQ-同步通讯的优缺点&#xff08;P61&#xff0c;P62&#xff09; 同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&…...

【SpringBoot】中的ApplicationRunner接口 和 CommandLineRunner接口

1. ApplicationRunner接口 用法&#xff1a; 类型&#xff1a; 接口 方法&#xff1a; 只定义了一个run方法 使用场景&#xff1a; springBoot项目启动时&#xff0c;若想在启动之后直接执行某一段代码&#xff0c;就可以用 ApplicationRunner这个接口&#xff0c;并实现接口…...

微信小程序前后端开发快速入门(完结篇)

这篇是微信小程序前后端快速入门完结篇了&#xff0c;今天利用之前学习过的所有知识做一个新的项目「群登记助手v1.0」小程序。 整体技术架构&#xff1a;小程序原生前端小程序云开发。 经历了前面教程的学习&#xff0c;大家有了一定的基础&#xff0c;所以本次分享重心主要是…...

【Linux】进程间通信之消息队列

文章目录 消息队列的概念消息队列的出队特点消息队列函数接口获取消息队列向消息队列发送消息接收消息操作消息队列的接口 代码演示ipcs命令 消息队列的概念 消息队列提供进程间数据块传输的方法&#xff0c;传输的每一个数据块都认为是有类型的&#xff0c;不同的数据块是有优…...

一次Linux中的木马病毒解决经历(6379端口---newinit.sh)

病毒入侵解决方案 情景 最近几天一直CPU100%,也没有注意看到了以为正常的服务调用,直到腾讯给发了邮件警告说我的服务器正在入侵其他服务器的6379端口,我就是正常的使用不可能去入侵别人的系统的,这是违法的. 排查 既然入侵6379端口,就怀疑是通过我的Redis服务进入的我的系统…...

ProtoBuf

文章目录 1.认识 ProtoBuf2. 安装ProtoBuf3. 快速上手 ProtoBuf4. proto3 语法5. probuf 实战6. 总结 1.认识 ProtoBuf 在认识 啥是 ProtoBuf 之前我们先来 回顾一下 &#xff08;或 了解 一下 啥是 序列化&#xff09; 序列化概念回顾 : 图一 : 回顾 序列化 &#xff0c;下面…...

AJ-Captcha行为验证在vue中的使用

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 项目场景&#xff1a;由原先的验证码校验升级为行为验证校验 使用方法 提示&#xff1a;参考文档&#xff1a; 参考文档&#xff1a;vue使用AJ-Captcha文档 gitee地址&#xff1a;AJ-Captcha &…...

Layui列表复选框根据条件禁用

// 禁用客服回访id有值的复选框res.data.forEach(function (item, i) {if (item.feedbackEmpId) {let index res.data[i][LAY_TABLE_INDEX];$(".layui-table tr[data-index"index"] input[typecheckbox]").prop(disabled,true);$(".layui-table tr[d…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...