Linux动态库静态库生成与使用
Posted Hero_HL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux动态库静态库生成与使用相关的知识,希望对你有一定的参考价值。
1. 源文件编写
对应五个文件,被封装的函数对应两个头文件和两个实现方法的文件,加一个主函数调用封装的方法的测试文件。
源文件fun1.h
#include <iostream>
using namespace std;
void fun1();
源文件fun1.cpp
#include "fun1.h"
void fun1()
{
cout << "fun1" << endl;
}
源文件fun2.h
#include <iostream>
using namespace std;
void fun2();
源文件fun2.cpp
#include "fun2.h"
void fun2()
{
cout << "fun2" << endl;
}
源文件main.cpp
#include "fun1.h"
#include "fun2.h"
int main()
{
fun1();
fun2();
return 0;
}
2. 静态库制作和使用
先基于.cpp或者.c文件生成对应的.o文件,将几个.o文件 使用ar -cr命令 生成libname.a文件
libname.a 为静态库, name 为静态库的名字,本例的静态库就叫test
Makefile中编译的前三行为静态库的制作,第四行编译main.cpp时为链接静态库(使用静态库)
源文件Makefile
all:
g++ -c fun1.cpp -o fun1.o
g++ -c fun2.cpp -o fun2.o
ar -cr libtest.a fun1.o fun2.o
g++ main.cpp -o main -I ./ -L ./ -ltest
clean:
rm fun1.o fun2.o libtest.a main
Makefile编译命令的详解
g++ -c fun1.cpp -o fun1.o
g++ -c fun2.cpp -o fun2.o
-c:只编译不链接,只生成目标文件。后面的fun1.o fun2.o就是目标文件
ar -cr libtest.a fun1.o fun2.o
-c 建立备存文件。
-r 将文件插入备存文件中
命令用于建立或修改备存文件,或是从备存文件中抽取文件
Linux ar命令介绍:https://www.runoob.com/linux/linux-comm-ar.html
静态库命名规则:libxxx.a(xxx是自己定义的静态库名称,用于链接)
g++ main.cpp -o main -I ./ -L ./ -ltest
编译主函数链接上静态库
-I 表示静态库头文件路径
-L 表示静态库或者动态库的路径
链接静态库写成 -l库名即可:-ltest
编译之前的源文件截图
编译之后的源文件截图
测试截图
3. 动态库制作和使用
源文件Makefile
all:
# 方法一
#g++ -c -fPIC fun1.cpp -o fun1.o
#g++ -c -fPIC fun2.cpp -o fun2.o
#g++ -shared -o libtest.so fun1.o fun2.o
#g++ main.cpp -o main -I ./ -L ./ -ltest
# 方法二
g++ -shared -fPIC fun1.cpp fun2.cpp -o libtest.so
g++ main.cpp -o main -I ./ -L ./ -ltest
clean:
rm *.o
动态库需要使用-shared 选项以及-fPIC选项
-fPIC表示代码是和地址无关的,不需要被不同模块重定位
-shared 选项表示生成的是.so动态库文件
此时编译完了还无法直接执行,会找不到动态库。还需要配置动态库路径
3.1 配置动态库路径方法一:
export LD_LIBRARY_PATH="./:$LD_LIBRARY_PATH"
将./当前文件夹配置到LD_LIBRARY_PATH,只是暂时生效
3.2 配置动态库路径方法二:
使用 ldconfig 机制(需 root 权限):在 /etc/ld.so.conf.d/ 下创建一个 test.conf 文件
添加动态库所在目录的绝对路径
然后,运行 ldconfig
4. 静态库和动态库区别
静态库在程序编译时会被连接到目标代码中,程序运行时不再需要静态库;而动态库在程序编译时,不会放到连接的目标代码中,而是在程序运行时被载入,因此在程序运行时还需要动态库的存在。
以上是关于Linux动态库静态库生成与使用的主要内容,如果未能解决你的问题,请参考以下文章