我有一些代码使用了一些共享库(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/