静态库与动态库区别
- 怎么生成静态库?
- 怎么生成动态库?
- 怎么利用动态库或静态库生成可执行文件?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_mian
比dynamic_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等技术内容,立即学习