linux指定动态库路径

linux指定动态库路径

通常有两种方法:

1.把动态库放到系统库或者在系统库中做一个链接,这样编译和运行都会去系统库找。这样容易引起系统库混乱。

2.export LD_LIBRARY_PATH=###。指定库搜索路径,但是这样注销再登陆就没了。


还有第三种方法,编译时使用-Wl,-rpath,-Wl,路径

这样就能把路径编译到可执行文件里,但是这样只能在本地使用,拿到其他地方就需要把库和路径也拷贝过去才行。但是这在调试我们程序时还是非常实用的,特别是在系统库里存在同一库的不同版本时。


下面是我写的一个小例子:

#vim libtest.c

#include <stdio.h>

int add_fun(int a,int b)
{
    return a+b;
}


#gcc -fPIC -shared -o libtest.so libtest.c 
#vim main.c


#include <stdio.h>
int main()
{
    int a,b,sum;
    a = 1028;
    b = 23409;
    sum = sum_fun(a,b);
    printf("sum = %d\n",sum);
    return 0;
}

#gcc main.c -o main.o -Wl,-rpath,-Wl /home/hb/test/lib/libtest.so


 # ldd main.o
    linux-gate.so.1 =>  (0x00b0c000)
    /home/hb/test/test/lib/libtest.so (0x00eae000)
    libc.so.6 => /lib/libc.so.6 (0x005cc000)
    /lib/ld-linux.so.2 (0x004b7000)
这时可以看到,libtest.so的路径直接写进了可执行文件
这样执行时就不会去系统库里找找个文件了

### 如何在Linux中运行命令时指定动态库路径 当需要在Linux环境中执行程序并希望该程序使用特定位置的共享库而非默认搜索路径中的库文件时,可以采用多种方法来临时或永久地修改动态链接器的行为。 #### 使用`LD_LIBRARY_PATH`环境变量 最简单的方式是在调用命令之前设置`LD_LIBRARY_PATH`环境变量。此变量告知加载器除了标准目录外还应在哪些地方寻找所需的.so文件[^3]。 ```bash export LD_LIBRARY_PATH=/path/to/custom/lib:$LD_LIBRARY_PATH ./your_program ``` 这种方式适用于一次性操作或是交互式的shell会话内;对于脚本来说,则可以在启动应用程序前加入上述两行指令。 #### 利用`ldconfig`配置缓存 如果打算让自定义库成为系统的一部分供多个应用访问,那么应该编辑 `/etc/ld.so.conf.d/*.conf` 文件并将新路径添加进去,之后通过 `sudo ldconfig` 更新全局缓存[^1]。这使得任何依赖这些库的应用都能自动找到它们而无需额外设定。 #### 命令行参数传递给解释器 某些情况下可以直接向可执行文件提供选项以改变其行为。例如,在编译阶段可以通过 `-rpath` 参数嵌入固定的查找地址到二进制里去。不过这种方法较为少见且灵活性较差。 为了确保使用的库路径符合 Linux Standard Base 目录结构的要求,建议优先考虑利用现有的标准化路径如 `/usr/local/lib`, `/opt/<package>/lib` 等作为存放第三方库的位置,并借助前述手段之一使能之。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值