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

这篇具有很好参考价值的文章主要介绍了动态库、静态库的构建与使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、理解动态库与静态库

静态、动态是指链接

所谓静态、动态是指链接。回顾一下,将一个程序编译成可执行程序的步骤:
链接: 把外部函数的代码(通常是后缀名为.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 haha.h)
# 更改输出库的名字 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博客文章来源地址https://www.toymoban.com/news/detail-455215.html

到了这里,关于动态库、静态库的构建与使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【linux深入剖析】动态库的使用(续) | 动静态库的链接

    🍁你好,我是 RO-BERRY 📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 回顾上节,我们在创建了动态库libmymath.so 我们使用指令 gcc main.c -L. -lmymath -L . (-L + 路径表示myc这个库在哪

    2024年04月15日
    浏览(30)
  • Linux中静态库和动态库的使用

    介绍: 库是一个二进制文件,包含的代码可被程序调用 标准C库、数学库、线程库… 库有源码,可下载后编译;也可以直接安装二进制包 位置一般放在:/lib /usr/lib 库的知识 库是事先编译好的,可以复用的代码 在os上运行的程序基本上都要使用库,使用库可以提高开发效率

    2024年01月25日
    浏览(28)
  • 【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用

    🍁你好,我是 RO-BERRY 📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 软链接和硬链接是在Linux系统中常见的文件链接方式。 软链接(Symbolic Link): 软链接是一个指向目标文

    2024年04月13日
    浏览(33)
  • windows下qt使用第三方库(静态链接库lib)、静态库和动态库区别、动态库的使用。

    这里主要是讲述windows下qt使用第三方库。 windows下qt使用第三方库(静态链接库lib)。 为了能够使测试更准确,首先自己用qt创建了一个已经封装好的lib库。 然后让另一个项目去链接这个lib静态库,并且去调用里面的方法。 目的: 使 untitled项目 能够使用 myllplib.lib 静态库,这

    2023年04月17日
    浏览(75)
  • CMake构建静态库与动态库以及使用

    用例子的方式通俗易懂地解释CMake构建静态库与动态库的过程。 任务: 建立一个静态库和动态库,提供HelloFunc 函数供其他程序编程使用,HelloFunc向终端输出Hello World 字符串。 安装头文件与共享库。 编写一个程序去使用构建的共享库。 (1)建立 t3 目录,用于存放本节涉及到

    2024年02月07日
    浏览(26)
  • 【Linux系统编程】Linux下的编译器——gcc/g++的使用 及 动态库和静态库的认识

    这篇文章我们继续学习Linux中的开发工具,今天要学的是: Linux下的编译器——gcc/g++ 我们先来简单了解一下它们的概念: gcc (GNU Compiler Collection) 和 g++ 是 Linux 系统上最常用的编译器。它们是 GNU 组织开发的一套开源编译器工具集。 gcc: gcc 是 GNU 编译器集合中的 C 语言编译器。

    2024年02月16日
    浏览(34)
  • 关于静态库和动态库的操作

    目录 静态库 动态库 1.增加.o文件: 2.删除.o文件: 查看静态库和动态库中的函数名 1.查看静态库中的函数名(以libexample.a为例): 2. 查看动态库中的函数名(以libexample.so为例): 查看动态库和静态库是32位,还是64位 1.  如果是动态库,可以使用: file *.so   2. 如果是静态库,可

    2024年02月07日
    浏览(27)
  • 静态链接库和动态链接库的区别

    在编译时将库的代码( .lib文件 )和应用程序的代码合并在一起,生成一个单独的可执行文件。 发布时非常方便,直接一个.exe文件即可 库的代码在编译时和链接时与应用程序分开。应用程序包含对库的引用( .lib文件 ,在这里被称为导入库),但不包含库的实际代码。 在 运行

    2024年02月11日
    浏览(29)
  • Rust : 与C交互动态库和静态库的尝试

    rust调用C端的库函数,有很多方法,场景也有所不同。包括windows还是linux,内置库还是自定义库,还是三方库等等。 一、rust调用其内置的C库 这个很简单,直接把extern \\\"C\\\"引入即可: 比如,在rust端main.rs中: 不需要做其它的处理,直接cargo run 就可以运行。 二、自定义的C库-以

    2024年02月04日
    浏览(36)
  • 关于不同版本VS编译获得的静态库、动态库的兼容性

    看了上一篇博客还是在6月13号,一直想着写一些东西,也准备了很多内容,没想到一直拖到了现在。今天终于掀开了我的笔记本盖子,按下了开机按钮,双击浏览器图标打开了博客页(浏览器图标都差点找不到了~~),赶紧写完一篇睡觉,明晚还要给我的小可爱做饭呢。。。

    2024年02月05日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包