Linux动态库静态库生成与使用

14 篇文章 1 订阅

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. 静态库和动态库区别

静态库在程序编译时会被连接到目标代码中,程序运行时不再需要静态库;而动态库在程序编译时,不会放到连接的目标代码中,而是在程序运行时被载入,因此在程序运行时还需要动态库的存在。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值