静态库与动态库

简介: 静态库与动态库

静态库与动态库区别

  • 怎么生成静态库?
  • 怎么生成动态库?
  • 怎么利用动态库或静态库生成可执行文件?Linux 与 Windows 文件格式分别是?
  • 为什么利用静态库生成的可执行文件比利用动态库生成的可执行文件大?
  • 怎么指定动态库生成可执行文件?

准备代码:

// add.cpp
#include "api.h"
int add(int a, int b) {
    return a + b;
}
//api.h
#pragma once
int add(int a, int b);
int del(int a, int b);
//del.cpp
#pragma once
int add(int a, int b);
int del(int a, int b);

静态库

  • Linux中.a 文件是静态文件相当于Windows下.lib文件。
  • 静态链接 的方式会将静态库编译进具体的可执行程序,如将libapi.a编译进static_mian可执行程序中。导致可执行程序static_miandynamic_main大许多。
$ g++ -c add.cpp -o add.o  #生成目标文件
$ g++ -c del.cpp -o del.0
$ ar rcs libapi.a del.o add.o  #生成静态库文件
#依赖静态库生成可执行文件static_main
$ g++ -static main.cpp -o static_main -L./ -lapi -I./

代码运行结果:
add(1,2) = 3
del(1,2) = -1

动态库

Linux中.so 文件是动态文件相当于Windows下.DLL文件。

g++ -shared -fPIC -o libapi.so del.o add.o  #生成libapi.so动态库
#依赖动态链接库生成可执行文件
g++ main.cpp -o dynamic_main -L./ -lapi -I./ 

代码运行结果:
./dynamic_main: error while loading shared libraries: libapi.so: cannot open shared object file: No such file or directory

继续分析

  • 为什么会报错?
    答:动态库需要指定搜索路径,这个路径在一个宏定义当中,默认会在/lib/usr/lib路径中查找。显然我们得动态库并没有在前面所述的默认路径下,所以我们要将指定该动态库路径。
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/guoqiang/share/test
执行./dynamic_main 就成功了:
add(1,2) = 3
del(1,2) = -1

充电站

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习

相关文章
|
安全 Shell 网络安全
openssh和openssl的区别是什么?
【4月更文挑战第14天】openssh和openssl的区别是什么?
1751 0
|
关系型数据库 MySQL Java
Java 最常见的面试题:mysql 的内连接、左连接、右连接有什么区别?
Java 最常见的面试题:mysql 的内连接、左连接、右连接有什么区别?
|
算法 程序员
理解操作系统内存管理:页面置换算法全解析
大家好,我是小米,热爱分享技术的大哥哥!今天聊的是操作系统中的页面置换算法。它解决的是内存满载时,如何选择合适的页面移出以腾出空间的问题。主要有三种算法:FIFO(先进先出),简单但性能不佳;LRU(最近最久未使用),考虑时间局部性,性能较好但实现较复杂;OPT(最佳置换),理论上最优但无法实际应用。这些算法各有千秋,在实际应用中需根据场景选择最合适的方案。希望这能帮大家更好地理解内存管理的核心机制!
554 2
|
XML 开发框架 JSON
探索 SOAP:揭开 Web 服务的神秘面纱(上)
探索 SOAP:揭开 Web 服务的神秘面纱(上)
|
存储 算法
回溯算法:排列与组合详解
回溯算法,本质上是一种穷举算法,属于暴力搜索算法的一种。它虽然可以使用剪枝进行优化,仍不高效,但却实用。它往往能够解决可以抽象成树形结构的问题,亦可以认为是使用 K 层 for循环实现搜索的问题。
396 0
回溯算法:排列与组合详解
|
网络安全 数据安全/隐私保护
【Sword系列】第七届全国残疾人职业技能大赛样题-网络安全-Book
凯撒密码是一种简单的替换密码,它将明文中的每个字母都替换成向右(或向左)移动固定数量个位置后的另一个字母。具体来说,如果使用的是向右移动 n 位的凯撒密码,那么字母 A 将替换成第 n+1 个字母(即 B),字母 B 将替换成第 n+2 个字母(即 C),以此类推,字母 Z 将替换成第 n 个字母(即 A)。
247 0
 【Sword系列】第七届全国残疾人职业技能大赛样题-网络安全-Book
|
Python
想学Python又看不懂英文 ?20秒教会你PyCharm如何设置中文 !
想学Python又看不懂英文 ?20秒教会你PyCharm如何设置中文 !
10567 0
想学Python又看不懂英文 ?20秒教会你PyCharm如何设置中文 !
|
数据采集 机器学习/深度学习 NoSQL
火车票被秒光,别慌!快用Python来抢票!
火车票被秒光,别慌!快用Python来抢票!
|
JSON 网络协议 Android开发
Kotlin + Netty 在 Android 上实现 Socket 的服务端
Kotlin + Netty 在 Android 上实现 Socket 的服务端
1053 0
Kotlin + Netty 在 Android 上实现 Socket 的服务端
|
存储 弹性计算 边缘计算
抖音服务器带宽有多大,才能供上亿人同时刷?今天长见识了。。
抖音,百度,阿里云,腾讯都是自建的数据中心,都是T级别出口带宽(总出口带宽),也就是达到1T=1024G/s的出口带宽,服务器总署基本都在20万台以上,甚至阿里云都超过了100万台。 字节跳动的数据中心总带宽,可能在10TB级别左右,预期突破15TB级别不远了。 一般情况下:总出口带宽1TB,实际机房出口带宽可能只有100G上下, 这是采用双(多)链路设计,双出口实现动态流量分担,总的出口带宽可以达到T级别。
1874 0
抖音服务器带宽有多大,才能供上亿人同时刷?今天长见识了。。