linux动态链接库的使用
文件结构
目录结构
pwd
/home/virgil/Desktop/shared_object
tree
.
├── lib
│ └── add.c
└── main
└── main.c
add.c
int add(int a,int b)
{
return a+b;
}
main.c
#include <stdio.h>
//声明要调用库中的函数
int add(int a,int b);
int main()
{
printf("%d\\n",add(1,2));
return 0;
}
编译动态库
进入lib
目录
gcc add.c -fPIC -shared -o libadd.so
编译源代码
进入main
目录
gcc main.c -o a.out -ladd
这时编译会报错,提示找不到动态链接库add
那么可以手动通过-L
参数给出add动态链接库的路径
gcc main.c -o a.out -l add -L ../lib/
如果每次都需要指明路径未免太麻烦了,实际上gcc默认会有一个默认搜索路径,它会首先在该路径中进行搜索,该路径通常是/lib
或者/usr/lib
目录.
那么我就把libadd.so
拷贝到该目录下即可
sudo cp ../lib/libadd.so /usr/lib
更常用的方法是使用软链接的方式,这样更新libadd.so
时就无需重复拷贝
cd /usr/lib
ln -s /home/virgil/Desktop/shared_object/lib/libadd.so
重新编译,就成功了
gcc main.c -o a.out -ladd
另外,除了手动在gcc参数中指明路径外还可以通过环境变量的方式来指出路径(绝对路径)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/virgil/Desktop/shared_object/lib
如果不想每次都要export
可以在 ~/.bashrc
或者 ~/.bash_profile
中添加下面的命令
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/virgil/Desktop/shared_object/lib
遇到问题
-
尝试修改
/etc/ld.so.conf.d
文件夹中的conf文件来指明路径,仍然提示找不到该库ld.so.conf
是运行时的动态链接,与编译时的链接动作无关,所以修改里面的conf文件是无法让gcc找到所需的库的