动态库、静态库的构建与使用

news2024/11/23 21:37:49

一、理解动态库与静态库

静态、动态是指链接

所谓静态、动态是指链接。回顾一下,将一个程序编译成可执行程序的步骤:
链接: 把外部函数的代码(通常是后缀名为.lib和.a的文件),添加到可执行文件中。这就叫做连接(linking)。这种通过拷贝,将外部函数库添加到可执行文件的方式,叫做静态连接(static linking),还有动态连接(dynamic linking)

命名方式

linux下:
静态库:lib库名.a
动态库:lib库名.so(shared object)

window:下
静态库:lib库名.lib
动态库:lib库名.dll(dynamic link library)

区分一个概念:库是包含前缀lib以及后缀.a或者.so的一个整体

库名是去掉前缀和后缀剩下的部分


动态库和静态库的特点

静态库的特点:
1、使用静态库的时候,会将静态库的信息直接编译到可执行文件中
2、优点:当静态库被删除,对可执行文件没有影响
3、缺点:浪费内存空间。如果静态库被修改,可执行程序要重新编译

动态库的特点:
加载器在加载动态库时,操作系统会先检查动态库是否因为其它程序已经将这个动态库信息加载到了内存中。如果没有加载到内存中,操作系统会将动态库载入内存,并将它的引用计数设置为1;如果已经加载到内存,仅将动态库的引用计数加1。

二、构建动态库和静态库

工程目录

haha.cpp随便写点,比如命名一个函数,打印"haha"

CMakeList.txt

aux_source_directory(./ SOURCES)

add_executable(example ${SOURCES})

# 添加动态库 得到libhaha.so动态库文件
add_library(haha SHARED haha.cpp)
# 给动态库添加版本号 得到libhaha.so.1.2  同时得到两个软链接 具体看结果说明
set_target_properties(haha PROPERTIES VERSION 1.2 SOVERSION 1)

# 添加静态库  得到libhaha.a静态库文件
add_library(haha_static STATIC haha.cpp)
# 更改输出库的名字 libhah.a 修改为 libhello.a 
set_target_properties(haha_static PROPERTIES OUTPUT_NAME "hello")

# 设置可执行文件的输出路径 这是是工程目录下的lib目录
SET(EXECUTABLE_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/lib")
# 设置库文件的输出路径 这是是工程目录下的lib目录
SET(LIBRARY_OUTPUT_PATH "${PROJECT_SOURCE_DIR}/lib")

结果说明

运行后会得到一个lib目录,里面有可执行文件和我们构建的动态库、静态库文件。

打开lib目录:

libhello.a文件是静态库文件,以下命令得到:

# 添加静态库  得到libhaha.a静态库文件
add_library(haha_static STATIC haha.cpp)
# 更改输出库的名字 libhah.a 修改为 libhello.a
set_target_properties(haha_static PROPERTIES OUTPUT_NAME "hello")

libhaha.so.1.2文件是静态库文件,同时 libhaha.so.1软链接 libhaha.so软链接,由该命令得到:

# 添加动态库 得到libhaha.so动态库文件
add_library(haha SHARED haha.cpp)
# 给动态库添加版本号 得到libhaha.so.1.2  同时有两个链接
#  VERSION指代动态库版本, SOVERSION 指代API版本
set_target_properties(haha PROPERTIES VERSION 1.2 SOVERSION 1)

三、使用动态库

使用动态库的条件

必须有动态库的头文件,这里即 haha.h 头文件

必须要知道动态库所在路径:

CMakeLists.txt

# 动态库所在目录
set(lib_dir "/home/jason/work/my-deploy/example/lib")

# 添加 动态库头文件 搜索路径
include_directories(./)

# 生成可执行文件
add_executable(example main.cpp)

# 链接库文件到可执行文件  库文件名称要写全
target_link_libraries(example ${lib_dir}/libhaha.so)

mai.cpp中需要应用动态库的头文件,方可使用动态库的函数

这里头文件是 haha.h,动态库函数为 haha(),会在控制台打印 haha!

#include <iostream>
#include "haha.h"

using namespace std;

int main()
{
    cout << "Hello World!" << endl;
    haha();
    return 0;
}

四、使用静态库

使用静态库基本与使用动态库一致,也需要准备静态库所在路径,静态库头文件

CMakeLists.txt

链接库文件时,改成静态库名称即可

# 静态库所在目录
set(lib_dir "/home/jason/work/my-deploy/example/lib")

# 添加 静态库头文件 搜索路径
include_directories(./)

# 生成可执行文件
add_executable(example main.cpp)

# 链接库文件到可执行文件  库文件名称要写全
target_link_libraries(example ${lib_dir}/libhello.a)

参考:

【Cmake实战:番外】库、动态库和静态库(.dll,.so,.lib,.a)_cmake dll和lib_郑同学的笔记的博客-CSDN博客

【cmake实战六】如何使用编译的库(动态库dll)——windows系统_cmake编译动态库_郑同学的笔记的博客-CSDN博客
【cmake实战五】如何使用编译的库(静态库)——windows系统_windows编译静态库_郑同学的笔记的博客-CSDN博客

 创建静态库/动态库一定要有头文件吗?为什么?_使用静态库需要头文件吗_吃西瓜蘸辣酱的博客-CSDN博客
c++使用静态库和直接使用源码有什么区别?_生成静态库链接和直接编译的区别_千么漾漾的博客-CSDN博客

 

C++编译之(3)-camke/CMakeLists.txt的编译使用教程_丰色木夕的博客-CSDN博客 

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

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

相关文章

Java面试知识点(全)-分布式和微服务-redis面试知识点

redis是什么 redis是一种支持Key-Value等多种数据结构的存储系统。可用于缓存、事件发布或订阅、高速队列等场景。该数据库使用ANSI C语言编写&#xff0c;支持网络&#xff0c;提供字符串、哈希、列表、队列、集合结构直接存取&#xff0c;基于内存&#xff0c;可持久化。 为…

一个神奇的小工具,让URL地址都变成了“ooooooooo“

转换的逻辑有点像短链平台一样&#xff0c;只不过这个是将你的URL地址变的很长长长长&#xff0c;但是看着都是 ooooooooo&#xff0c;很好奇是如何实现的&#xff0c;所以查阅了源码&#xff0c;本文解读其核心实现逻辑&#xff0c;很有趣且巧妙的实现了这个功能。 发现一个很…

kaggle帕金森病进展预测大赛金牌方案分享

赛题背景 帕金森病 &#xff08;PD&#xff09; 是一种致残的脑部疾病&#xff0c;会影响运动、认知、睡眠和其他正常功能。不幸的是&#xff0c;目前没有治愈的方法 - 并且疾病会随着时间的推移而恶化。据估计&#xff0c;到2037年&#xff0c;美国将有1万人患有帕金森病&…

LeetCode 1080. Insufficient Nodes in Root to Leaf Paths【递归,二叉树】中等

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

【Java|基础篇】详解static关键字和代码块

文章目录 1.前言2.static关键字2.1 static修饰成员变量2.2 static修饰成员方法 3. 代码块3.1 普通代码块3.2 静态代码块3.3 构造代码块 4.总结 1.前言 本文主要讲解static关键字以及代码块的执行顺序以及各部分代码块的作用. 2.static关键字 Java中的static关键字是用来修饰…

hive函数02

hive函数02 窗口函数 窗口函数&#xff08;Window functions )也叫做开窗函数、OLAP函数&#xff0c;其最大特点是∶输入值是从SELECT语句的结果集中的一行或多行的“窗口”中获取的。 窗口函数可以简单地解释为类似于聚合函数的计算函数&#xff0c;但是通过GROUP BY子句组合…

jenkins 常见问题汇总

1、win11 节点&#xff08;Error: Unable to access jarfile slave.jar&#xff09; jenkins 默认cd 进入到设置的目录下面&#xff0c;如果不是C盘的话&#xff0c;直接cd 进入不了其他盘&#xff0c;所以&#xff0c;需要在命令前面&#xff0c;加参数进入到对应盘符。eg:E:…

pandas1

pandas pandas 的核心是&#xff1a;‘Series’、‘DataFrame’、Index’三个类型 1. 创建DataFrame对象 1.1 通过二维数组创建 scores np.random.randint(60,101,(5,3)) scoresarray([[ 91, 87, 87],[100, 80, 61],[ 76, 84, 80],[ 81, 97, 69],[ 67, 77, 65]]…

如何查看SSL证书的有效期?(中科三方)

SSL证书能够对数据传输进行加密处理&#xff0c;对网站的真实性进行核验&#xff0c;是网站提升数据安全能力的重要手段&#xff0c;现在已经有越来越多的网站开始安装SSL证书。但为了保障加密技术的快速更新&#xff0c;SSL证书的有效期逐渐缩短&#xff0c;而一旦SSL证书失效…

【腾讯云 Finops Crane 集训营】心得体会

【腾讯云 Finops Crane 集训营】心得体会 一直在关注技术社区的活动&#xff0c;希望看到更多的新技术&#xff0c;最近在逛 CSDN 的过程中&#xff0c;让我有机会参加了腾讯云的 Finops Crane 开源项目的第一季活动&#xff0c;从而深入了解了这个项目。Crane是一种云资源分析…

PMP常考知识点整理

1十大知识领域之项目整合管理 ❒ 变更控制流程&#xff08;简化版&#xff09; 书面记录变更请求→分析影响→提交CCB进行审批→批准或者拒绝→若批准&#xff0c;先修改计划&#xff08;体现变更&#xff09;&#xff0c;再通知变更受影响相关方&#xff0c;最后再执行、追踪…

【PCIE720】 基于PCIe总线架构的高性能计算(HPC)硬件加速卡

板卡概述 PCIE720是一款基于PCI Express总线架构的高性能计算&#xff08;HPC&#xff09;硬件加速卡&#xff0c;板卡采用Xilinx的高性能28nm 7系列FPGA作为运算节点&#xff0c;在资源、接口以及时钟的优化&#xff0c;为高性能计算提供卓越的硬件加速性能。板卡一共具有5个F…

Linux---文件操作命令(find、which、read)

1. find命令 find [路径] [参数] 要查找的目录路径&#xff0c;可以是一个目录或文件名&#xff0c;也可以是多个路径&#xff0c;多个路径之间用空格分隔&#xff0c;如 果未指定路径&#xff0c;则默认为当前目录。 可选参数&#xff0c;用于指定查找的条件&#xff0c;可…

day37_JQuery

今日内容 零、 复习昨日 一、JQuery 零、 复习昨日 正则 匹配,筛选字符串[0-9a-zA-ZA-z\d\w]*?{3}{4,}{5,10}^$reg.test(字符) jquery js封装的库,封装js操作,可以用来操作事件,dom,动画,ajax$("#id") $("element") $(".class")$("选择器…

chatgpt赋能Python-pythonwhile遍历

Python中使用while循环遍历的优势 Python是一种高级语言&#xff0c;广泛用于Web开发、数据科学、人工智能等方面。Python提供了多种循环结构&#xff0c;其中while循环是一种非常常用的遍历方式。在本篇文章中&#xff0c;我们将介绍如何在Python中使用while循环遍历&#xf…

A2L文件的自动生成(Simulink/CANape)

目录 什么是A2L文件&#xff1f; 使用simulink生成A2L文件 A2L文件组成 characteristic measurement compu_method group simulink生成的A2L与CANape生成的A2L 如何自动修改simulink生成A2L文件使其适用于CANape&#xff1f; 所需文件 什么是A2L文件&#xff1f; A2…

27 KVM管理系统资源-管理虚拟CPU份额

文章目录 27 KVM管理系统资源-管理虚拟CPU份额27.1 概述27.2 操作步骤 27 KVM管理系统资源-管理虚拟CPU份额 27.1 概述 虚拟化环境下&#xff0c;同一主机上的多个虚拟机竞争使用物理CPU。为了防止某些虚拟机占用过多的物理CPU资源&#xff0c;影响相同主机上其他虚拟机的性能…

什么是数字化校园,校园怎么数字化?

教育数字化转型是目前教育领域的一个热门话题&#xff0c;那么到底什么是教育数字化转型&#xff1f;如何做好教育数字化转型&#xff1f;这就来回答一下&#xff01; 阅读本文你将了解&#xff1a; 什么是教育数字化转型&#xff1f;零代码平台如何撬动教育数字化转型&#…

真别去阿里面试,6年测开经验的真实面试经历.....

前几天我朋友跟我吐苦水&#xff0c;这波面试又把他打击到了&#xff0c;做了快6年软件测试员。。。为了进大厂&#xff0c;也花了很多时间和精力在面试准备上&#xff0c;也刷了很多题。但题刷多了之后有点怀疑人生&#xff0c;不知道刷的这些题在之后的工作中能不能用到&…

Linux·eventfd 原理与实践

1. eventfd/timerfd 简介 目前越来越多的应用程序采用事件驱动的方式实现功能&#xff0c;如何高效地利用系统资源实现通知的管理和送达就愈发变得重要起来。在Linux系统中&#xff0c;eventfd是一个用来通知事件的文件描述符&#xff0c;timerfd是的定时器事件的文件描述符。…