【CMake保姆级教程】制作动静态链接库、指定动静态库输出路径

文章目录

  • 前言
  • 一、动静态链接库的介绍
    • 1.1 动态链接库 (DLL)
    • 1.2 静态链接库 (LIB)
  • 二、制作静态库
  • 三、制作动态库
  • 四、指定动静态库输出路径
    • 4.1 方式1 - 适用于动态库
    • 4.2 方式2 - 都适用
  • 总结


前言

在软件开发中,我们经常听到动态链接库(Dynamic Link Library,DLL)和静态链接库(Static Link Library,LIB)的术语。它们是一种组织和共享代码的方式,有助于提高代码的可维护性和可重用性。本教程将使用CMake来创建动态链接库和静态链接库,为你提供一份简单易懂的指南,让你轻松理解这两种库的概念和制作过程。


一、动静态链接库的介绍

1.1 动态链接库 (DLL)

动态链接库是一种包含可执行代码和数据的文件,它可以在运行时被加载和执行。这种库的主要优势在于代码的共享,多个程序可以同时使用同一个动态链接库,从而减少内存占用。在不同的操作系统中,DLL的文件后缀不同:

在Windows上,动态链接库的后缀通常是.dll(比如mylibrary.dll)。

在Linux上,通常是.so,表示共享对象(Shared Object,比如libmylibrary.so)。

在macOS上,也是.dylib,表示动态库(Dynamic Library,比如libmylibrary.dylib)。

1.2 静态链接库 (LIB)

相比之下,静态链接库在编译时被嵌入到程序中,程序在运行时不再依赖外部库。这意味着每个程序都包含其所需的所有代码,但也可能导致更大的可执行文件。静态链接库的文件后缀也因操作系统而异:

在Windows上,静态链接库的后缀通常是.lib(比如mylibrary.lib)。

在Linux上,通常是.a,表示归档文件(Archive,比如libmylibrary.a)。

在macOS上,同样是.a,表示静态库(Static Library,比如libmylibrary.a)。

二、制作静态库

在cmake中,如果要制作静态库,需要使用的命令如下:

add_library(库名称 STATIC 源文件1 [源文件2] ...) 

STATIC后面的为你要生成静态库的源文件

在Linux中,静态库名字分为三部分:lib+库名字+.a,此处只需要指定出库的名字就可以了,另外两部分在生成该文件的时候会自动填充。

在Windows中虽然库名和Linux格式不同,但也只需指定出名字即可。

首先,我们创建一个a.cpp作为示例:

.
├── a.cpp
├── bin
├── build
├── CMakeLists.txt
├── include
└── src

接下来我们在cmake里面添加上这句:

add_library(testlib a.cpp)

然后我们使用cmake和make命令

Consolidate compiler generated dependencies of target app
[ 60%] Built target app
[ 80%] Building CXX object CMakeFiles/testlib.dir/a.cpp.o
[100%] Linking CXX static library libtestlib.a
[100%] Built target testlib
ubuntu@ubuntu-2204:~/C/csdn-cmake/build$ tree -L 1
.
├── app
├── CMakeCache.txt
├── CMakeFiles
├── cmake_install.cmake
├── libtestlib.a
└── Makefile

1 directory, 5 files

接下来我们看一下文件:

.
├── a.cpp
├── bin
│   └── app
├── build
│   ├── app
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   ├── cmake_install.cmake
│   ├── libtestlib.a
│   └── Makefile
├── CMakeLists.txt
├── include
│   └── func.h
└── src
    ├── func.cpp
    └── main.cpp

5 directories, 11 files

可以看到libtestlib.a这边就有Linux的静态文件夹了

在这里插入图片描述

三、制作动态库

制作动态库
在cmake中,如果要制作动态库,需要使用的命令如下:

add_library(库名称 SHARED 源文件1 [源文件2] ...)

我们只需要把STATIC 换成 SHARED 即可

add_library(testlib SHARED a.cpp)

在这里插入图片描述
可以看到,这样就成功生成了我们的so动态库文件

四、指定动静态库输出路径

4.1 方式1 - 适用于动态库

对于生成的库文件来说和可执行程序一样都可以指定输出路径。由于在Linux下生成的动态库默认是有执行权限的,所以可以按照生成可执行程序的方式去指定它生成的目录:

cmake_minimum_required(VERSION 3.0)
project(test)
include_directories(${PROJECT_SOURCE_DIR}/include)
file(GLOB SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
# 设置动态库生成路径
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
add_library(test SHARED ${SRC_LIST})

4.2 方式2 - 都适用

由于在Linux下生成的静态库默认不具有可执行权限,所以在指定静态库生成的路径的时候就不能使用EXECUTABLE_OUTPUT_PATH宏了,而应该使用LIBRARY_OUTPUT_PATH,这个宏对应静态库文件和动态库文件都适用。

cmake_minimum_required(VERSION 3.0)
project(CALC)
include_directories(${PROJECT_SOURCE_DIR}/include)
file(GLOB SRC_LIST "${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp")
# 设置动态库/静态库生成路径
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
# 生成动态库
#add_library(test SHARED ${SRC_LIST})
# 生成静态库
add_library(test STATIC ${SRC_LIST})

总结

通过CMake,我们可以轻松地创建和管理动态链接库和静态链接库,使得代码的组织和共享变得更加简单。动态链接库允许多个程序共享相同的代码,而静态链接库将代码嵌入到程序中,减少了对外部依赖的需求。选择使用哪种库取决于你的项目需求和偏好,但理解它们的差异将有助于你更好地设计和组织你的代码。希望这个保姆级教程能够让你对动态链接库和静态链接库有一个清晰的认识。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

劈窗算法反演地表温度

目录 摘要操作步骤提取热红外单波段提取NDVI同步像元分辨率与个数劈窗算法地表温度反演制图 摘要 主要使用HJ-2(环境减灾二号卫星)的IRS传感器的两个热红外波段,以及红波段与近红波段计算得到的NDVI,使用劈窗算法,得到…

如何在Linux下搭建接口自动化测试平台

我们今天来学习一下在Linux下如何搭建基于HttpRunner开发的接口自动化测试平台吧! 需要在Linux上提前准备的环境(下面是本人搭建时的环境): 1,Python 3.6.8 2,MySQL 5.7 一:下载HttpRunner…

用数码管慢速动态扫描显示数字“1234“

#include<reg51.h> // 包含51单片机寄存器定义的头文件 void delay(void) //延时函数&#xff0c;延时一段时间 { unsigned char i,j; for(i0;i<250;i) for(j0;j<250;j) ; } void main(void) { while(1) //无限循…

AI绘画中CLIP文本-图像预训练模型

介绍 OpenAI 在 2021 年提出了 CLIP&#xff08;Contrastive Language–Image Pretraining&#xff09;算法&#xff0c;这是一个先进的机器学习模型&#xff0c;旨在理解和解释图像和文本之间的关系。CLIP 的核心思想是通过大规模的图像和文本对进行训练&#xff0c;学习图像…

(自适应手机版)英文外贸网站模板 - 带三级子目录

(自适应手机版)英文外贸网站模板 - 带三级子目录 PbootCMS内核开发的网站模板&#xff0c;该模板适用于外贸网站、英文网站类等企业&#xff0c;当然其他行业也可以做&#xff0c;只需要把文字图片换成其他行业的即可&#xff1b; 自适应手机版&#xff0c;同一个后台&#x…

STM32的以太网外设+PHY(LAN8720)使用详解(3):PHY寄存器详解

0 工具准备 1.野火 stm32f407霸天虎开发板 2.LAN8720数据手册 3.STM32F4xx中文参考手册1 PHY寄存器 前面介绍到&#xff0c;站管理接口&#xff08;SMI&#xff09;允许应用程序通过2线时钟和数据线访问任意PHY寄存器&#xff0c;同时该接口支持访问最多32个PHY&#xff0c;也…

探讨APP自动化测试工具的重要性

随着移动应用市场的蓬勃发展&#xff0c;企业对于保证其移动应用质量和用户体验的需求日益迫切。在这一背景下&#xff0c;APP自动化测试工具正变得越来越重要&#xff0c;成为企业成功的关键组成部分。本文将探讨APP自动化测试工具对企业的重要性&#xff0c;并为您解析其在提…

python中整数和浮点数的运算

任意两个数相除时&#xff0c;结果总是浮点数&#xff0c;即便这两个数能够整除。例如&#xff1a; 在任何运算中&#xff0c;只要有操作数是浮点数&#xff0c;结果总是浮点数。例如&#xff1a;

DshanMCU-R128s2 ADC 按键配置方法

FreeRTOS平台上使用的按键为ADC-KEY&#xff0c;采用的ADC模块为GPADC。 按键功能驱动的实现是通过ADC分压&#xff0c;使每个按键检测的电压值不同&#xff0c;从而实现区分不同的按键。按下或者弹起中断之后&#xff0c;通过中断触发&#xff0c;主动检测当前电压识别出对应…

STM32的以太网外设+PHY(LAN8720)使用详解(4):STM32管脚配置

0 工具准备 1.野火 stm32f407霸天虎开发板 2.LAN8720数据手册 3.STM32F4xx中文参考手册1 MCU管脚配置 1.1 使能外设相关时钟 STM32配置任何外设的第一步都是使能相关的外设时钟&#xff0c;根据前面的原理图我们需要使能相关的引脚时钟&#xff0c;同时我们需要使能SYSCFG时…

Linux服务器nginx部署Vue前端(详细版)

提示&#xff1a;适用于前后端项目的部署 文章目录 前言一、打包前端文件二、下载和部署Nginx三、配置conf文件启动nginx 前言 搜索到这篇文章想必你已经对Nginx比较了解&#xff0c;我也不对Nginx进行介绍赘述了&#xff0c;只需要明白Nginx本身也是一个静态资源的服务器&…

postman几种常见的请求方式

1、get请求直接拼URL形式 对于http接口&#xff0c;有get和post两种请求方式&#xff0c;当接口说明中未明确post中入参必须是json串时&#xff0c;均可用url方式请求 参数既可以写到URL中&#xff0c;也可写到参数列表中&#xff0c;都一样&#xff0c;请求时候都是拼URL 2&am…

LeetCode-17 电话号码的字母组合

LeetCode-17 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;d…

opencv入门到精通——OpenCV4.1.2之性能衡量与优化方法

目录 目标 使用OpenCV衡量性能 OpenCV中的默认优化 在IPython中衡量性能 更多IPython魔术命令 性能优化技术 目标 在图像处理中&#xff0c;由于每秒要处理大量操作&#xff0c;因此必须使代码不仅提供正确的解决方案&#xff0c;而且还必须以最快的方式提供。因此&#…

Python中__getitem__的奇妙应用

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 理解 __getitem__ 方法 1 基本概念 在Python中&#xff0c;__getitem__ 是一个重要的魔法方法&#xff0c;用于实现对象的索引访问。当使用类似 obj[index] 的方式访问对象时&#xff0c;Python 解释器会自动调…

C#线程Thread的使用

引言 在C#编程语言中&#xff0c;线程是一种并发执行的机制&#xff0c;可以实现多个任务同时执行&#xff0c;提高程序的效率和响应能力。C#提供了Thread类来处理线程相关的操作。本文将详细介绍C#中Thread类的使用方法和注意事项。 目录 引言线程的基本概念线程&#xff08;…

SoapUI、Jmeter、Postman三种接口测试工具的比较分析!

前段时间忙于接口测试&#xff0c;也看了几款接口测试工具&#xff0c;简单从几个角度做了个比较&#xff0c;拿出来与诸位分享一下。本文从多个方面对接口测试的三款常用工具进行比较分析&#xff0c;以便于在特定的情况下选择最合适的工具&#xff0c;或者使用自己编写的工具…

Selenium Web自动化实践案例,跟着敲代码真香

1 项目背景 https://passport.csdn.net/login CSDN登录页面 2 功能实现 自动运行用例 自动生成测试报告 自动断言与截图 自动将最新测试报告发送到指定邮箱 数据&#xff0c;页面元素分离 PageObjectUnittestddt数据驱动用例 执行日志、分布式执行 3 项目架构…

多线程同步之:QWaitCondition

一、 QWaitCondition 不是通过 强制执行互斥&#xff0c;而是通过提供 条件变量 来同步线程。 1.1 使用 互斥量 和 QReadWriteLock&#xff0c;存在的一个问题 1.2 QWaitConditionQMutex 1.3 1.4 消费者线程先启动 2个线程启动的先后顺序不应调换&#xff1a;用先启动thread…

从零开发短视频电商 在AWS上用SageMaker部署自定义模型

文章目录 简介使用model.tar.gz1.从huggingface上下载模型2.自定义代码3.打包为tar 文件4.上传model.tar.gz到S35.部署推理 使用hub1.在sagemaker上新建个jupyterlab2.上传官方示例ipynb文件3.指定HF_MODEL_ID和HF_TASK进行部署和推理 inference.py官方示例 简介 原始链接&…