linux下动态库的编写和调用
linux下编写和调用一个简单的动态库大概分为以下几个步骤:
- 创建动态库程序文件
add.c
int add(int a,int b)
{
return a+b;
}
- 创建引用头文件
head.c
#ifndef _HEAD_
#define _HEAD_
int add(int a,int b);
#endif
- 生成目标文件
生成要加编译器选项 -fpic
gcc -fpic -c add.c
- 然后生成动态库
注意使用链接器选项 -shared
gcc -shared –o libhead.so add.o
- 编写主程序进行调用
main.c
#include <stdio.h>
#include "head.h"
int main(void)
{
printf("3+5 sum = %d \n",add(3,5));
return 0;
}
- 生成可执行文件并链接库文件
编译程序时,使用动态链接库和静态库是一致的,使用”-l库名”的方式。
gcc -o main main.c -L ./ -lhead
-L指定动态链接库的路劲,-ldXX链接库函数XX。-lXX是动态库的调用规则。Linux系统下的动态库命名方式是lib*.so,而在链接时表示位-l*,*是自己命名的库名。
- 报错解决
error while loading shared libraries: libhead.so: cannot open shared object file: No such file or directory
这是因为程序运行时没有找到动态链接库的原因,注意linux不会自动在当前目录查找动态库文件。解决方案一般有三种,借鉴博客园SmartVessel原文:
(1.) 用ln将需要的so文件链接到/usr/lib或者/lib这两个默认的目录下边
ln -s /home/用户名/code/lib/*.so /usr/lib
sudo ldconfig
注意填写你的动态库所在目录的路径,若不知道可以用pwd查看全路径。如果路径不对,可能会报错:
cannot open shared object file: Error 40
(2.) 修改LD_LIBRARY_PATH
export LD_LIBRARY_PATH=/home/用户名/code/lib/:$LD_LIBRARY_PATH
sudo ldconfig
(3.) 修改/etc/ld.so.conf,然后刷新
vim /etc/ld.so.conf
add /home/用户名/code/lib/
sudo ldconfig
必须记得更新sudo ldconfig,否则还是会报错。
- 运行测试
./main
3+5 sum = 8
好啦,测试成功,有问题可以留言讨论!