静态库与动态库
第1章 静态库
理论
静态库编译快,但占用空间大。动态库编译慢,但占用空间小。具体建议去网上搜,会说得比较仔细。
创建静态库命令
ar是创建静态库的工具。rcs是命令参数静态库一般以lib开头,以.a为后缀file.o是用来制作静态库的汇编文件
ar rcs libmylib.a file.o
创建简单静态库及使用
制作步骤1.将.cpp文件生成.o文件2.使用ar工具制作静态库
创建.cpp文件
创建add.cpp文件
int add(int a,int b) { return a+b; }
创建sub.cpp文件
int sub(int a,int b) { return a-b; }
创建div.cpp文件
int div(int a,int b) { return a/b; }
生成.o文件
不加-o 参数也会将默认将生成的文件取名为对应的.o文件
g++ -c add.cpp g++ -c sub.cpp -o sub.o g++ -c div.cpp -o div.o
生成静态库
ar rcs libmymath.a add.o sub.o div.o
新建文件夹lib,生成该静态库后,将.a文件移动到lib下
制作静态库头文件
静态库通常会有对应的头文件,因此我们还需要制作头文件新建文件夹,在该文件夹下制作头文件mymath.h
#pragma once int add(int a,int b); int sub(int a,int b); int divl(int a,int b);
编译和使用
创建main.cpp文件
#include<iostream> #include"mymath.h" using namespace std; int main() { int a=10; int b=3; cout<<"a+b="<<add(a,b)<<endl; cout<<"a-b="<<sub(a,b)<<endl; cout<<"a/b="<<divl(a,b)<<endl; return 0; }
查看当前目录下的文件
inc(含有mymath.h文件) lib(含有libmymath.a文件) main.cpp
编译链接
g++ main.cpp ./lib/libmymath.a -o main -I ./inc
第2章 动态库
动态库制作与使用
创建.cpp文件
创建add.cpp,sub.cpp,div.cpp。文件内容读者自己写,此处略过。
生成.o文件
将.c文件生成.o文件(生成与位置无关的代码,加上参数 -fPIC)
gcc -c add.c -o add.o -fPIC gcc -c add.c -o sub.o -fPIC gcc -c add.c -o div.o -fPIC
制作动态库
使用gcc -shared 制作动态库注意这里的.o文件都是加上-fPIC参数生成的
gcc -shared lib库名.so add.o sub.o div.o
创建一个lib文件夹,将生成的.so文件放到lib下
制作动态库头文件
制作一个inc文件夹,创建mymath.h头文件。
#pragma once int add(int a,int b); int sub(int a,int b); int divl(int a,int b);
编译和运行
先查看你你当前目录下的文件(其它文件不要管)
inc(含有mymath.h文件) lib(含有libmymath.so文件) main.cpp(写了main函数)
编译可执行程序时,指导所使用的动态库。-l:指定库名 -L:指定库路径。 注意-l指定动态库文件时去掉lib前缀,去掉.so后缀。-l和-L后面的文件可以选择加上空格或者不加。
g++ main.cpp -o main -lmymath -L./lib -I./inc
运行可执行程序main出错:原因:编译时需要用到链接器和动态链接器。这里没有指定动态库所在目录位置。链接器: 工作于链接阶段,工作时需要-l和-L参数动态链接器:工作于程序运行阶段,工作时需要提供动态库所在目录位置
解决办法
解决办法有以下4种:
- 临时设置环境变量(关闭终端后失效)
- 在./bashrc文件种写入环境变量
- 拷贝动态库到/lib(标准c++库所在目录),但是不建议这样做。
- 配置文件
- 临时设置环境变量:
LD_LIBRARY_PATH=./lib(建议这里最好绝对路径设置环境变量)
执行main命令还是会出错,原因是我们还没有导出我们的环境变量
export LD_LIBRARY_PATH=./lib(建议这里最好使用绝对路径设置环境变量)
现在就可以正常执行main程序了。
- 配置文件 1)sudo vim /etc/ld.so.conf 2)将动态库的绝对路径追加到该文件下 3)sudo ldconfig -v 使配置文件生效,-v就是查看的意思