c - 为什么每次运行应用程序时都必须使用导出定义 LD_LIBRARY_PATH?

标签 c linux gcc shared-libraries ld

我有一些代码使用了一些共享库(gcc 上的 c 代码)。编译时,我必须使用 -I 和 -L 显式定义包含和库目录,因为它们不在标准位置。当我尝试运行代码时,出现以下错误:

./sync_test 
./sync_test: error while loading shared libraries: libsync.so: cannot open shared object file: No such file or directory

但是,执行以下操作,一切正常:

export LD_LIBRARY_PATH="/path/to/library/"
./sync_test

现在,奇怪的是,这只能工作一次。如果我再次尝试运行sync_test,我会得到同样的错误,除非我先运行导出命令。我尝试将以下内容添加到我的 .bashrc 中,但没有任何区别:

LD_LIBRARY_PATH="/path/to/library/"

最佳答案

您应该避免在 .bashrc 中设置 LD_LIBRARY_PATH。见 "Why LD_LIBRARY_PATH is bad"了解更多信息。

使用链接器选项 -rpath同时链接,以便动态链接器知道在运行时在哪里找到 libsync.so

gcc ... -Wl,-rpath /path/to/library -L/path/to/library -lsync -o sync_test

编辑:

另一种方法是使用这样的包装器

#!/bin/bash

LD_LIBRARY_PATH=/path/to/library sync_test "$@"

如果 sync_test 启动任何其他程序,它们最终可能会使用 /path/to/library 中的库,这可能是也可能不是。

关于c - 为什么每次运行应用程序时都必须使用导出定义 LD_LIBRARY_PATH?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/695530/

相关文章:

Linux CFS(完全公平调度程序)延迟

C程序以最短的执行时间减少大量数字

c - sscanf 指针与变量地址

c - 是否有 CIEDE2000 或 CIE94 Delta-E 色差计算算法的已知实现?

c - Unix 套接字示例,编译器找不到 header

linux - 在 Linux 上监视目录中的文件更改

c++ - 在 C++/G++ 中是否有*任何*方法来获取 C 样式数组的长度?

c - fork 过程中的确定性 malloc

c - C中的冒泡排序文件

c - 以二维数组为参数的函数