版权声明:允许转载,请注明文章出处 https://blog.csdn.net/Vickers_xiaowei/article/details/85020029
静态库
静态库:一些公共代码是需要反复使用,就把这些代码编译为“库”文件;在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中的这种库。
程序编译一般需经预处理、编译、汇编和链接几个步骤。静态库特点是可执行文件中包含了库代码的一份完整拷贝;缺点就是被多次使用就会有多份冗余拷贝。
生成静态库
静态库生成:将所有的***.o 文件打包在一起生成
打包的命令:ar -cr lib***.a ***.o
(其中-c创建,-r模块替换)
1、编辑c++文件、和对应的头文件,头文件不可省略,头文件用于告知用户如何使用该动态库。
C++文件
//test.cc
#include "test.hpp"
int Add(int a,int b)
{
return a+b;
}
头文件test.hpp,这个头文件是必须要有的,在调用静态库的源程序中要引该头文件,用来告诉源程序,静态库的函数实现。
#include <iostream>
int Add(int a,int b);
2、生成.o文件
g++ -c test.cc -o test.o
3、生成静态库
ar -cr libtest.a test.o
4、查看静态库是否成功生成
objdump -S libtest.a //查看静态库内容
5、使用静态库
编辑了一个C++文件
//main.cc
#include <iostream>
#include "test.hpp" //这里必须包含静态库的头文件
int main()
{
int a = 10,b = 20;
std::cout << Add(a,b) << std::endl;
return 0;
}
-L静态库路径 静态库名称
动态库
动态库又称动态链接库,动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。
动态库:一份动态库可以被用到该库的所有进程共用,外部函数的机器码由操作系统从磁盘上复制到内存(虚拟内存的共享区)中的过程叫做动态链接。
一个动态链接的可执行程序文件仅仅包含它用到的函数的入口地址的一个表,而不是外部函数所在目标文件的整个机器码。
生成动态库(运行时库)
1、 --share
是生成动态库的gcc链接选项,没有这个,将认为生成可执行程序
将所有的.o文件打包 生成命令:gcc --share ***.o -o lib***.so
2、要生成一个动态库,gcc编译器说:在编一阶段,将一个.c——>.o需要加上一个编译选项:-fPIC(产生位置无关代码)。动态库当中的代码不能是绝对地址,只能是相对地址,因此需要-fPIC,产生与位置无关的代码。
gcc -fPIC -c ***.c -o ***.o
g++ -fPIC -c test.cc -o test.o
g++ --share test.o -o libtest.so
3、查看动态库内容:
objdump -S libtest.so
4、gcc 的链接属性:-Lpath用于指定库的查找路径,-lname用于指定链接的库名称(去掉前缀和后缀)
如果出现以下错误,那么说明,你的动态库没有放到指定的动态库路径下,它运行时候,找不到动态库,才报错。
./a.out: error while loading shared libraries: libtest.so:
cannot open shared object file: No such file or directory
但作为一个简单的测试例子,让我们改动系统的东西,似乎不太合适。还有另一种简单的方法,就是为a.out指定 LD_LIBRARY_PATH。
LD_LIBRARY_PATH=. ./a.out
程序就能正常运行了。LD_LIBRARY_PATH=. 是告诉 a.out,先在当前路径寻找链接的动态库。