我正在我没有root访问权限的机器上进行一些C编程。我编译了一些我正在链接的共享库,但由于我无法在典型位置(/usr/local/lib
)安装库,因此每次编译和运行时都必须明确指定库的位置。编译时,这只是意味着将-L
标志添加到gcc
命令,但是对于程序执行来说,这更令人讨厌。我必须在每个会话中将非标准目录添加到LD_LIBRARY_PATH
,或者我必须在执行命令的开头添加LD_PRELOAD=/path/to/libs
。
在我没有root访问权限的计算机上有更好的方法吗?
顺便说一下,机器正在运行Red Hat 4.1。答案 0 :(得分:3)
有几种解决方案,从好到坏:
$ORIGIN
,例如gcc main.o -L../lib -lfoo -Wl,-rpath='$ORIGIN'/../lib
gcc main.o -L../LIB -lfoo -Wl,-rpath=/home/user/lib
LD_LIBRARY_PATH
或.bashrc
.profile
醇>
解决方案1允许您在任何地方安装二进制文件,只要您将二进制文件和库一起移动,例如my-app / bin / a.out和my-app / lib / {needed-shared-libs} .so。它还允许应用程序的多个版本及其共享库集。
如果您只需要一组共享库,解决方案2可以正常工作,并且永远不希望移动它们。
解决方案3会影响您运行的每个应用程序,并可能导致其中一些应用程序绑定到您的共享库而不是系统库。这可能会导致它们崩溃,使用未解析的符号失败,或者导致其他痛苦。为了加剧,这个问题只会发生在你和其他人身上,所以你很难获得帮助。
答案 1 :(得分:1)
您可以将环境变量添加到.bashrc
(或您登录时shell源的任何文件)。
答案 2 :(得分:1)
如果在编译和链接程序时设置环境变量LD_RUN_PATH
,那么该搜索路径将被烘焙到可执行文件中,动态链接器将在运行时搜索它。
答案 3 :(得分:-1)
使用LD_LIBRARY_PATH或LD_PRELOAD几乎是如何做到这一点的。要解决此问题,请将程序从myprog重命名为myprog-exe,并创建一个类似于myprog的shell脚本:
#!/bin/sh
export LD_LIBRARY_PATH=/path/to/libs:$LD_LIBRARY_PATH
`dirname $0`/myprog-exe
这样,当有人运行myprog时,它会真正运行shell脚本然后运行myprog。