安得情怀似旧时 2020-01-29
目录结构
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找到所需的库的