动态库和静态库
一、动态库
1、特点
- 动态库文件以.so作为后缀的
- 动态库只有在程序运行的时候才会去连接动态库的代码
- 动态库是由多个程序共享使用的库代码,因此也叫共享库
- 使用动态库的程序每次都要根据加载的起始位置计算内部函数以及变量地址 因此加载和运行速率不如静态库
- 相对静态库解约内存和磁盘空间,减少页面交换
2、生成动态库
动态库的命名规则:libxxx.so
g++ -fPIC -c add.cpp
g++ -shared -o libadd.so add.o
//-fPIC:产生位置无关码
//-shared:生成共享库
用makefile实现生成动态库
dy-lib=libmycounter.so.PHONY:all
all:$(dy-lib)$(dy-lib):counter.og++ -shared -o $@ $^
counter.o:counter.cppg++ -fPIC -c $^.PHONY:clean
clean:rm -rf *.o *.so
3、使用动态库
当我们经过上诉操作可以得等到动态库libmycounter.so,之后我们要通过编译器编译形成可执行文件,具体步骤如下
- -I:告诉编译器,包含的头文件在哪里
- -L:告诉编译器,包含的动态库在哪个文件夹下
- -l:告诉编译器,包含的动态库是该文件夹下的哪一个
g++ test.cpp -I counter.h -L . -lmycounter
生成一个a.out的文件
此次运行可执行文件发现还是不行,这是因为我们只是把动态库和头文件高数了编译器,但是加载器还是不知道文件在哪里,因此我们也应该把动态库的位置告诉加载器
解决找不到动态库问题的方法:
方法一、讲动态库拷贝到/usr/lib/
sudo cp libcounter.so /usr/lib/
方法二、添加到环境变量LD_LIBRARY_PHAT
export LD_LIBRARY_PHAT=$LD_LIBRARY_PHAT:/home/qyf/test.cpp/test.cpp-05-17
//冒号后面填写动态库的路径即可,无需输入动态库
方法三、建立软连接到lib里
sudo ln -s /home/qyf/test.cpp/test.cpp-05-17/libmycounter.so /lib/libmycounter.so
//路径为绝对路径一直写到动态库,进行软连接到lib里面
二、静态库
1、特点
- 静态库是一组预编译的目标文件的集合,其中包含了函数和数据
- 静态库都是以.a为结尾
- 编译链接时静态库被复制到可执行文件中
- 连接到程序中,程序运行时讲不会被改变,静态库代码完全替代了可执行文件
- 会增加可执行文件的大小,但不需要外部依赖
2、生成静态库
生成静态库文件
g++ -c print.cpp print.o
//生成.o的文件
ar -rc libmyprint.a print.o
//生成静态库文件
在makefile中生成
static-lib=libmyprint.a
$(static-lib):print.oar -rc $@ $^
print.o:print.cppg++ -c $^
3、使用静态库
g++ test.cpp -L. -lmyprint
//L表示静态库所在的路径
//l表示指定的静态库
- -L:告诉编译器,包含的动态库在哪个文件夹下
- -l:告诉编译器,包含的动态库是该文件夹下的哪一个
生成一个a.out的文件
直接运行该文件即可