【Linux】动静态库的制作与使用

一.静态库的制作

静态库的名称格式为:libxxx.a  

注意 xxx 才是静态库的真正名字

lib=libprint.a   //静态库的名称

$(lib):print.o  //生成静态库 (依赖 .o 文件)
	ar -rc $@ $^   //使用 ar 命令 -rc 选项生成静态库

print.o:print.c   //g++ -c 选项生成 .o 文件
	g++ -c $^ 

.PHONY:clean
clean:
	rm -rf *.a *.o

output:
	mkdir -p Lib/include
	mkdir -p Lib/mylib
	cp *.h Lib/include
	cp *.a Lib/mylib
	

二.动态库的制作

动态库的名称格式为:libxxx.so  

注意 xxx 才是动态库的真正名字

注意动态库中生成 .o 文件时gcc 要带选项 -fPIC ,表示生成位置无关码

dy-lib=liblog.so   //动态库名称


$(dy-lib):log.o   //生成动态库 (依赖 .o 文件)
	g++ -shared -o $@ $^   //g++ -shared 选项

log.o:log.c   //生成 .o 文件
	g++ -fPIC -c $^   //注意这里要带个 -fPIC 选项

.PHONY:clean
clean:
	rm -rf *.o *.so

output:
	mkdir -p Lib/include
	mkdir -p Lib/mylib
	cp *.h Lib/include
	cp *.so Lib/mylib

三.动静态库混合制作

static-lib=libprint.a
dy-lib=liblog.so

.PHONY:all   //生成多个目标文件时,可以定义一个伪目标
all: $(static-lib)  $(dy-lib)

$(static-lib):print.o
	ar -rc $@ $^

print.o:print.c
	g++ -c $^

$(dy-lib):log.o
	g++ -shared -o $@ $^

log.o:log.c
	g++ -fPIC -c $^

.PHONY:clean
clean:
	rm -rf *.a *.o *.so

output:
	mkdir -p Lib/include
	mkdir -p Lib/mylib
	cp *.h Lib/include
	cp *.a Lib/mylib
	cp *.so Lib/mylib

注意:不论是静态库还是动态库,都不可以有 main 函数 。


四.动静态库的使用

我们先在 main.cpp 文件中使用一下静态库

#include "print.h"  //静态库中的头文件

int main()
{
    print_func();  //静态库中定义的方法

    return 0;
}

g++ main.cpp 编译这个文件,出现了这样的结果:

 很显然是找不到头文件,可是我们不是包含了头文件吗,怎么会找不到呢?

其实 gcc 默认是在系统路径下查找的,而我们包含的头文件并不在系统路径中,如何解决?

-I (大写的 I):可以让 gcc 在指定路径下查找

那我们就 g++ main.cpp -I Lib/include  (因为我们代码中包含了头文件,所以不需要加头文件名称)

可以发现还是找不到,因为我们只提供了头文件的路径,gcc 还找不到库文件在哪儿

-L:可以让 gcc 在指定路径下寻找库文件 

继续 g++ main.cpp -I Lib/include -L Lib/mylib

还是找不到,因为一个库文件目录中可能有多个库文件,我们必须要指定库文件的名字

-l(小写的l)+静态库名称(注意之间没有空格)

继续  g++ main.cpp -I Lib/include -L Lib/mylib -lprint

可以发现,这次编译通过,生成了可执行文件。

如果有多个库文件,写 多个 -l(小写的l)后面跟库文件的名字就行了。

可是这也太麻烦了吧,每次编译都要写这么一长串?不可以像库函数那样,只包个头文件就行了?

下面介绍四种方法解决这个问题


五.解决找不到动态库的四种方法

1.拷贝到系统默认的库路径

  • 头文件拷贝到: /usr/include
  • 库文件拷贝到:/lib64

其实这个就是我们常说的安装。

下面演示:

拷贝

验证是否拷贝成功

之后,g++ main.cpp -lprint (注意要带库文件名) 编译文件

2.在系统默认的库路径下建立软链接

  •  头文件:/usr/include 下建立软链接

  • 库文件:/lib64 下建立软链接

建立软链接:

为头文件的目录建立软链接,因为一个目录里可能有很多头文件。

验证是否建立成功:

 现在只需要在main.cpp文件中这么包含头文件就行了

之后,g++ main.cpp -lprint (注意要带库文件名) 编译文件

3.将自己的库所在的路径,添加到系统的环境变量LD_LIBRARY_PATH中

LD_LIBRARY_PATH 是系统提供用户层的搜索路径,一般情况下,你的电脑上可能没有设置,如果你配置过vim,那么会有如下信息:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:(库文件的路径)

4./etc/ld.so.conf.d建立自己的动态库路径的配置文件,然后重新ldconfig即可

最好切成root用户,然后进入 /etc/ld.so.conf.d 目录

cd /etc/ld.so.conf.d

这个目录下都是些 .conf 结尾的配置文件,这些文件里的内容都是路径。

 

我们只需要建立一个 .conf 文件,然后把对应动态库的路径放到这个文件里

然后 ldconfig 把所有的配置文件重新加载一下

ldconfig

介绍了这么多方法,其实最常用的还是第一种,即我们常说的安装。

这里提一个比较好玩的库 :ncurse 库,用这个库可以做出很多好玩的东西。

想了解的话,可以自行搜索。


🐬🤖本篇文章到此就结束了, 若有错误或是建议的话,欢迎小伙伴们指出;🕊️👻

😄😆希望小伙伴们能支持支持博主啊,你们的支持对我很重要哦;🥰🤩

😍😁谢谢你的阅读。😸😼

  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 20
    评论
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值