so动态库和a静态库的编译

一般linux环境下的链接库分为a库和so库,分别表示静态链接库和动态链接库,其作用是把C程序编译好做成一种可执行链接文件,c主程序文件调用这些程序的函数接口是可以使用a库或so库,在主程序中只需要include含有库中提供的函数接口声明的头文件即可。

一、生成a库

首先,你需要写几个你要调用的函数的源文件,如test1.c、test2.c等。其代码如下:

再将头文件写好(其实这里的头文件并不需要,若是编译成库的程序之间有调用关系的时候才用得到,只在调用链接库的时候编写头文件即可)。开始编译,将源文件编译成.o文件。命令行指令如下:


然后开始生成a库,指令如下:


注意:链接库前缀必须以lib开头

得到libtest.a库文件后,然后将.a库链接到主程序中,写主程序main.c和头文件main.h 。

加载a库,生成可执行文件并执行,指令如下:gcc main.c -L. -ltest -o test


可以看到,a库连接成功,可以调用到里面的函数。

二、生成so库

利用上面所写过的test1.c 和test2.c生成.so库的指令如下:


同样so库的前缀必须为lib,然后将.so库链接到主程序main.c中,这里需要注意一下,因为动态库的特性,编译器会到指定的目录去寻找动态库,目录的地址在/etc/ld.so.conf.d/ 目录里的libc.conf文件里,你可以在里面加一行地址表示你so库的位置,更改完conf文件里的内容,记得输入命令行:ldconfig。

你还可以将so库复制到默认的目录下。这里是将so库复制到了默认目录下,生成可执行文件并运行,指令如下:

gcc main.c -L. -ltest -o main


静态链接库和动态链接库的区别在于,主程序在运行前,静态链接库的链接固定写入在程序中,而动态链接库则是在每次程序运行再加载链接。

在加载动态链接库的时候,有可能会遇到加载不到的错误,原因在于系统默认加载的动态链接库路径里没有找到你的动态库,有三种解决方法:

1.在执行gcc main.c -L. -ltest -o main 前,执行 export LD_LIBRARY_PATH=$(pwd)

2.将你so所在的目录写到/etc/ld.so.conf文件里,然后执行ldconfig。

3.将你的so放在/etc/ld.so.conf里的路径位置里。

猜你喜欢

转载自blog.csdn.net/coolwriter/article/details/80631470