CMake 打包已经存在的动态库生成 target

【cmake学习】set_target_properties 常见属性以及获取target 属性 【cmake学习】set_target_properties 常见属性以及 get_target_properties 获取target 属性 阅读详情
一. 背景

在 CMakeLists.txt 中,某模块 A 通过 add_subdirectory 引入模块 B ,模块 B 通过 add_subdirectory 引入模块 C。模块 C 里面本身就是一个开源的动态库,比如 libtask。目的想要将 C 模块打包成一个 Target ,以便在 A 模块中中使用方便。

二. 旧版本实现和存在问题

A 模块不直接使用 C 模块,但是 A 模块使用到了 B 模块,B 模块编译依赖 C 模块,就需要导致 A 编译时要通过下面的方式引入 C 模块

  include_directories(${CMAKE_SOURCE_DIR}/thirdparty/B/thirdparty/C/include)
  link_directories(${CMAKE_SOURCE_DIR}/thirdparty/B/thirdparty/C/lib)

该使用方式 A 即为不友好。如果上层存在 M 模块依赖 A 模块,也要通过类似方式用 C,导致使用上极为不友好。

三.解决方案

在 CMake 中有 Target 的概念,尝试单独将 C 打包成一个 Target,这样之后,当 A 依赖 B 时,B 依赖 C,A 不需要直接通过上面相对路径的方式,因为 Target 已经被包进去了。于是在 C 模块中,将所有的已经存在的 so 打包起来:

cmake_minimum_required (VERSION 3.10)

project(libtask)

file(WRITE ${PROJECT_BINARY_DIR}/empty.cpp "")
add_library (${PROJECT_NAME} SHARED ${PROJECT_BINARY_DIR}/empty.cpp)

target_include_directories(${PROJECT_NAME} PUBLIC include)
target_link_libraries(${PROJECT_NAME} PUBLIC
  ${CMAKE_CURRENT_SOURCE_DIR}/lib/libtask-a.so
  ${CMAKE_CURRENT_SOURCE_DIR}/lib/libtask-b.so
)

在 B 模块使用 A 模块时,可以使用下面的方式

xxx
add_subdirectory(thirdparty/libtask)
xxx
target_link_libraries(${PROJECT_NAME} PRIVATE libtask)

其他有问题的方案:
在实现 C 时也可以通过 INTERFACE 的方式打包 C,使用下面的方式:

cmake_minimum_required (VERSION 3.10)

project(libtask)

add_library (${PROJECT_NAME} INTERFACE)

target_include_directories(${PROJECT_NAME} INTERFACE include)
target_link_libraries(${PROJECT_NAME} INTERFACE
  ${CMAKE_CURRENT_SOURCE_DIR}/lib/libtask-a.so
  ${CMAKE_CURRENT_SOURCE_DIR}/lib/libtask-b.so
)

由于想要使用 INTERFACE 的方式打包库文件,此时就就必须使用 INTERFACE 的方式包含头文件和库文件,这样子就导致外部 A 模块无法直接使用 C 的库文件和头文件,还要使用

xxx
add_subdirectory(thirdparty/libtask)
xxx
target_link_libraries(${PROJECT_NAME} PRIVATE libtask)
cmake(动态、静态库细节) 本文介绍了现代CMake基于目标的库构建与使用流程,重点讲解了静态库和动态库的创建、安装及查找机制。主要内容包括: 静态库与动态库的构建方法 使用add_library()创建库目标 设置输出路径和编译选项 通过target_include_directories()指定头文件搜索路径 库的安装与发布 使用install()命令安装库文件和头文件 生成导出目标和配置文件 配置find_package()所需的包配置文件 库的查找与使用 通过find_package()查找已安装的库 使用target_lin 阅读详情

相关推荐

CMake 学习四:CMake 构建静态库和动态库

CMake 学习四:CMake 构建静态库和动态库

myw31415926的专栏 7233

【CMake】CMake创建、安装、使用静态库和动态库

本文介绍了使用CMake创建和管理静态库/动态库的方法。首先通过示例代码展示了如何编写CMakeLists.txt文件,分别使用ADD_LIBRARY命令生成动态库(SHARED)和静态库(STATIC)。针对同时生成两种库的需求,详细说明了SET_TARGET_PROPERTIES关键字的使用方法。随后讲解了如何通过INSTALL命令将库文件、头文件安装到系统目录。最后演示了如何使用已安装的库,包括设置头文件搜索路径和库链接方法,重点介绍了LINK_DIRECTORIES和TARGET_LINK_LIBR

Antonio915的博客 1499

CMake:add_library静态库和动态库

一个程序通常会按照功能需求,进行一定的划分,拆分成不同的子功能,子功能一般会被编译成库,每个库可能包含多个源文件和头文件,并且由不同的人同时进行开发。#aux_source_directory将当前目录下的所有源文件名字放入变量SO_SRCS。#aux_source_directory将当前目录下的所有源文件名字放入变量O_SRCS。#将lib_o及lib_so目录加入到工程中,即执行其中的CMakeLists.txt。#add_library指令用于编译库,SHARED表示是动态库。

风静如云的博客 2920

CMake进阶之CMake原理与关键概念

    上一篇文章中我们通过一个很简单的示例项目展示了CMake构建脚本CMakeFileLists.txt的构成,我们初步认识了CMake中的一些概念:target(目标)、command(命令)等等。这篇文章我们来学习一下CMake的原理,并详细阐述这些概念。 1 CMake的结构     CMake有三个关键概念:target、generator和command,其中target和com...

天山折梅 1万+

WGS-84 ECEF ENU 坐标系学习记录

地球坐标系固定在地球上而随地球一起在空间做公转和自转运动,因此地球上任一固定点在地球坐标系的坐标就不会由于地球旋转而变化。地心地固直角坐标系和大地坐标系都属于这种坐标系。 一、 几种坐标系 地心地固直角坐标系(ECEF)坐标系 其原点为地球的质心,x轴延伸通过本初子午线(0度经度)和赤道(0deglatitude)的交点。 z轴延伸通过的北极(即,与地球旋转轴重合)。 y轴完成右手坐标系,穿...

YYshuangshuang的博客 1万+

Windows安全中心空白问题修复:服务重置与系统组件修复实战指南

Windows系统服务是操作系统后台运行的核心组件,负责管理硬件资源、应用程序执行和系统功能。其稳定运行依赖于服务控制管理器、注册表配置和系统文件完整性。当关键服务(如Windows Update、安全中心服务)因更新失败、权限错误或组件损坏而无法正常启动时,依赖其功能的应用程序界面便会出现加载异常。在系统维护与故障排除领域,通过命令行工具重置服务状态、修复系统映像已成为工程师的必备技能。本文聚焦Windows安全中心界面空白这一典型故障,深入剖析其与Windows Update服务、组件存储损坏的关联,并

weixin_30859423的博客 423

CMake 手册详解(六)

CMake 手册详解(六) CMD#6:add_library 使用指定的源文件向工程中添加一个库。 add_library( [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] source1 source2 ... sourceN)   添加一个名为的库文件,该库文件将会根据调用的

655

动态规划与状态压缩:从TSP问题理解算法优化核心思想

动态规划是一种通过将复杂问题分解为重叠子问题并存储中间结果来避免重复计算的核心算法思想,广泛应用于路径优化、资源分配和序列决策等场景。其核心原理在于最优子结构和无后效性,通过状态设计和状态转移方程,将指数级复杂度问题转化为多项式时间可解。在工程实践中,状态压缩技术常被用于高效表示集合状态,例如使用二进制位运算来操作城市访问集合,从而大幅提升算法效率。本文以经典的旅行商问题(TSP)为例,深入剖析如何运用动态规划与状态压缩技术,将暴力穷举的指数级复杂度优化为可管理的计算量,为解决组合优化问题提供了重要的方法论

weixin_32075843的博客 365

【cmake】CMakeList添加库|添加头文件|添加路径|add_executable、add_library、target_link_libraries|添加编译选项|宏开关...

目录 官网查阅 开胃菜例子 CMakeLists生成和添加依赖库 CMakeLists更多小例子 生成.so共享库文件 调用.so共享库文件 生成一个可执行程序的 CMakeList 生成一个.so动态库的 CMakeList add_library(生成库),target_link_libraries(生成目标连接的库),set_t...

小鱼菜鸟的博客 8442

STM32F103C8T6 驱动2位共阳数码管(基于 74HC595 和 PNP 三极管)

整体设计思路是通过 STM32F103C8T6 控制 74HC595 和 PNP 三极管,实现共阳数码管的显示功能。最初的电路设计中,三极管发射极接 5V 电源,这导致了数码管两位显示相同数字的问题。数码管能够稳定显示 0-99的数字。

qq_40289410的博客 2208

phpstudy自定义安装mysql8.3并启动

下载压缩包文件然后按下面的图片一步一步操作选择版本,选择第一个压缩包文件,下载下载完成后,解压到phpstudy环境目录下

互联网碎碎念 2801

Cmake安装与动态库和静态库使用方法

在编译过程中不会将其打包到可执行文件中,是在程序运行的时候才进行载入的,可以节省内存空间,也方便跟新库文件。5、将生成的lib目录拷贝到自己的项目下,并配置cmakelists.txt,就完成了静态库文件使用。在编译过程中会将静态库打包到可执行文件中,每次更新静态库,可以执行文件都需要重新进行编译。1、在上面静态库生成的cmakelists.txt文件中进行修改,使其生成动态库文件。配置环境运行的环境变量或者将动态库文件拷贝到可执行文件同级目录。2、构建安装,生成对应的库目录。3、将目录拷贝到项目中。

qq_41888962的博客 1336

Java中使用工厂模式和策略模式优雅消除if-else语句(UML类图+案例分析)

在最近的后端开发中,多多少少会发现有很多if-else语句,如果条件过多则会造成整体代码看起来非常臃肿。本篇博客汇总了我对工厂模式和策略模式的理解,以及我是如何把它们巧妙运用在实际项目当中的一些技巧进行了分享,如有问题,欢迎评论区讨论!

黄团团的个人博客 2611

cmake动态库与静态库

cmake动态库与静态库

Jasmine-Lily的博客 1383

uniapp - H5人脸识别认证与活体检测功能(纯前端免费方案+微信sdk人脸识别)完整源码,微信公众号网页/h5端人脸识别功能人脸核身(微信方案提供后端spring boot+thinkphp源码

uniapp实现人脸认证,uniAPP h5手机拍照+人脸识别,免费人脸识别插件,前端人脸识别解决方案,uniapp H5人脸识别带前后摄像头,人脸识别在H5页面进行采集,微信公众号H5人脸核身,H5端人脸识别功能实现,免费h5人脸识别插件方案,微信公众号H5网页实现人脸识别,uniapp人脸监测,uniapp人脸生物监测,使用uniapp开发H5人脸采集功能/人脸识别功能,uniapp项目—h5端人脸采集功能实现,uniapp vue3人脸核身,H5活体检测认证,人脸认证张嘴摇摇头指引动作,人脸核身 微信

🏆 前端领域优质创作者 3808

AI原生SaaS应用的自动化运维体系构建

随着ChatGPT掀起的AI原生应用浪潮,越来越多SaaS(软件即服务)产品开始以"AI优先"的方式设计——从用户交互到核心功能,都深度依赖机器学习模型(如推荐算法、智能客服)、实时数据流(如用户行为分析)和弹性算力(如大模型推理)。这类应用的运维需求与传统SaaS完全不同:传统运维像"修水管",哪里漏了补哪里;AI原生运维则像"照顾会成长的宠物",需要实时感知模型状态、数据变化和流量波动,主动调整资源。

AI天才研究院 1079

【cmake】CMakeList添加库|添加头文件|添加路径|add_executable、add_library、target_link_libraries|添加编译选项|宏开关

Opencv依赖库的添加: cmake_minimum_required( VERSION 2.8 ) project( imageBasics ) # 添加c++ 11标准支持 set( CMAKE_CXX_FLAGS "-std=c++11" ) # 寻找OpenCV库 set(OpenCV_DIR /home/chaofan/opt/opencv-3.4.4/release) find_package( OpenCV 3 REQUIRED ) # 添加头文件 include_directo

我的笔记本 4万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

cmake--动态库和静态库

linux动态库--sowindows动态库--dlllinux静态库--awindows静态库--lib。

m0_60274660的博客 2811

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C语言-Cmake-CMakeLists.txt教程

CMakeLists.txt官网教程 , cmake命令配置等教程CMakeLists.txt文件使用的是Cmake命令完成的,那么我们来了解下常用的命令使用, 这是必须要会的,否则静态库,动态库,都没法导入,而且项目文件管理等都靠这个文件, 就算你代码学的在好,这个不懂最后都不可能是一个完整的项目,只能在编译工具跑跑而已,不能发布出去CMake是跨平台编译工具,比make更高级一些。其编译的主要工作是生成CMakeLists.txt文件,然后根据该文件生成Makefile,最后调用make来

weixin_45203607的博客 5159

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

CMake I 编译静态库、动态库和对象库

目录 一、源文件 1.Message.h 2.Message.cpp 3.helloworld.cpp 二、CMakeLists.txt 1.源文件 2.CMake语言说明 (1)cmake_minimum_required (2)project (3)add_library (4)add_executable (5)target_link_libraries 三、cmake配置及编译 1.cmake配置 2.构建/编译 【扩展】编译动态库 (1)修改CMakeLists.

该用户还没想到好的昵称的博客 3838

【CMake】 工程化实战:CTest 测试 + CPack 打包 + 外部命令集成全解析

在 C/C++ 开发中,CMake 早已成为跨平台构建的事实标准,但多数开发者仅掌握了基础的编译链接流程,却忽略了 CMake 生态中三个决定项目工程化水平的核心模块:CTest(自动化测试框架)、CPack(跨平台打包工具)和外部命令集成能力。这三个工具构成了 CMake 完整的 “构建 - 测试 - 交付” 闭环:CTest 让单元测试与构建流程无缝集成,CPack 实现一键生成多格式安装包,外部命令集成则能将代码生成、格式检查等自动化任务纳入构建体系。本文将结合实战案例,从原理到源码逐行拆解,帮你掌握

会当凌绝顶,一览众山小 726

cmake链接的到底是动态库还是静态库

LINK_DIRECTORIES(${CMAKE_SOURCE_DIR}/libs) 这个命令指定库文件的搜索路径。编译和运行中都有效。所有编出来的可执行文件依赖库可以放在这个目录下,减少对操作系统的目录依赖。 但是要注意一点,这里的搜索路径最终是绝对路径,意思也就是编译时就确定了这个目录,运行时也要搞一个相同的路径目录来存放依赖库。 TARGET_LINK_LIBRARIES(${LINK_TA...

weixin_44764006的博客 2959

CMake学习(5): 链接静(动)态库

通过可以生成我们所需的动态库或者静态库,我们要把制作出的。在发布的时候需要提供两种文件(1) 库文件(静态库/动态库)(2)头文件(保存了库文件中函数、变量申明);库文件对应的就是源文件,只不过我们对若干的源文件做了打包操作生成了一个二进制文件。在编写程序的过程中,可能会用到一些系统提供的动态库或者自己制作出的动态库或者静态库文件,cmake 中也为我们提供了相关的加载动态库的命令。

@bangbang的博客 1万+

【CMake】 动态库完全指南:从原理到实战,搞定 find_package 与 RPATH

在 C/C++ 开发中,库的管理是工程化的核心环节。静态库虽然简单,但会导致可执行文件体积膨胀、内存浪费;而 动态库(共享库) 凭借共享内存、按需加载、易于更新等优势,成为大型项目的首选。然而,动态库的运行时加载、版本管理、跨平台分发一直是新手的噩梦。CMake 作为 C/C++ 事实上的构建标准,提供了一套完整的动态库管理机制。本文将从底层原理出发,结合完整实战案例,带你掌握 CMake 动态库的生成、引用、安装、发布,以及find_package的两种核心查找模式,彻底解决 “cannot open s

会当凌绝顶,一览众山小 853

CMake 013:Linux 下动态库与可执行程序的完美融合

本文介绍了如何在Linux下使用CMake编译和链接动态库与可执行程序。主要内容包括:静态库与动态库的编译差异(仅需将STATIC改为SHARED),工程结构设计(单CMakeLists管理库和可执行程序),核心CMake配置(逐行解析动态库编译、头文件路径设置及链接),以及编译与运行验证(CMake自动注入rpath解决动态库查找问题)。文章还强调了跨平台兼容性,配置在Linux/Mac/Windows均可直接使用。通过这套流程,可高效解决C/C++工程中的库编译、链接和运行问题。

软件科学-郝学胜 146
上一篇: 实时操作系统与分时操作系统
NeilZhy
博客等级 码龄11年 175粉丝 145原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值