linux动态链接库的使用

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

遇到问题

  1. 尝试修改/etc/ld.so.conf.d文件夹中的conf文件来指明路径,仍然提示找不到该库

    ld.so.conf是运行时的动态链接,与编译时的链接动作无关,所以修改里面的conf文件是无法让gcc找到所需的库的

    参考

参考链接

编译的各个阶段简介,gcc链接操作

设置搜索库路径的方法,注意修改ld.so.conf不可取

相关推荐