我在一台没有root访问权限的机器上进行一些C编程。我已经编译了一些我要链接的共享库,但是因为我不能在典型位置(/usr/local/lib)安装库,所以我必须在每次编译和运行时显式地指定库的位置。在编译时,这仅仅意味着在gcc命令中添加-L标志,但是对于程序执行来说,这要麻烦得多。要么必须在每次会话中将非标准目录添加到LD_LIBRARY_PATH,要么必须将LD_PRELOAD=/path/to/libs添加到execute命令的开头。
有没有更好的方法在我没有root访问权限的机器上做这件事?
顺便说一句,这台机器正在运行Red Hat 4.1。
发布于 2011-04-04 21:18:40
有几种解决方案,从好到坏:
从您的gcc main.o -L../lib -lfoo -Wl,-rpath='$ORIGIN'/../lib
.profile使用
$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解决方案1允许您将二进制文件安装到任何地方,只要您将二进制文件和库一起移动,例如my-app/bin/a.out和my-app/lib/{needed shared-libs}.so。它还允许应用程序的多个版本及其共享库的集合。
如果您只需要一组共享库,并且从不希望移动它们,则解决方案2可以很好地工作。
解决方案3会影响您运行的每个应用程序,并可能导致其中一些应用程序绑定到您的共享库,而不是系统库。这可能会导致它们崩溃、因无法解析的符号而失败,或者给您带来其他痛苦。更糟糕的是,这个问题只会发生在你身上,而不会发生在其他人身上,所以你很难得到帮助。
发布于 2011-04-01 00:48:59
您可以将环境变量添加到.bashrc (或登录时您的shell源文件)。
发布于 2011-04-01 10:06:01
如果在编译和链接程序时设置了环境变量LD_RUN_PATH,那么该搜索路径将被嵌入到可执行文件中,并且动态链接器将在运行时对其进行搜索。
https://stackoverflow.com/questions/5503329
复制相似问题