2011-03-31 107 views
0

我正在一台没有root权限的计算机上进行一些C编程。我编译了一些我正在链接的共享库,但是因为我无法将这些库安装在典型的位置(/usr/local/lib),所以每次编译和运行时都必须明确指定库的位置。编译时,这意味着将-L标志添加到gcc命令中,但对于程序执行而言,这更令人讨厌。我必须在每个会话中将非标准目录添加到LD_LIBRARY_PATH,或者我必须将LD_PRELOAD=/path/to/libs添加到execute命令的开头。替代LD_PRELOAD或LD_LIBRARY_PATH

有没有更好的方式在我没有root权限的机器上执行此操作?

顺便说一句,该机器运行的是Red Hat 4.1。

+0

您可以使用'-rpath'或类似选项来硬编码二进制文件中库的路径。 – 2011-03-31 17:22:33

+1

等等.. Red Hat 4.1!?!在这种情况下,您只需将其根目录并安装系统范围的库... – 2011-03-31 17:23:17

回答

2

有几种解决方案,从更好地恶化:

  1. 使用$ORIGIN,例如gcc main.o -L../lib -lfoo -Wl,-rpath='$ORIGIN'/../lib
  2. 使用目标RPATH,例如, gcc main.o -L../LIB -lfoo -Wl,-rpath=/home/user/lib
  3. LD_LIBRARY_PATH.bashrc.profile

解决方案1,您可以在任何地方安装二进制,只要你移动的二进制和库一起,例如my-app/bin/a.out和my-app/lib/{needed-shared-libs} .so。它还允许应用程序的多个版本及其共享库的集合。

解决方案2工作正常,如果你只需要一套共享库,并且从不希望移动它们。

解决方案3会影响您运行的每个应用程序,并可能导致其中一些绑定到您的共享库而不是系统库。这可能会导致他们崩溃,未解决的符号失败,或导致您其他的痛苦。要加剧,这个问题只会发生在你和其他人身上,所以你很难得到帮助。

1

您可以将环境变量添加到您的.bashrc(或登录时您的shell源代码的任何文件)。

+0

将LD_LIBRARY_PATH添加到您的.bashrc是不合适的,因为它只与单个应用程序相关。当OP有两个版本的可执行文件时,会发生什么?与两个不同版本的共享库捆绑在一起? – Tom 2011-06-10 07:45:18

-1

使用LD_LIBRARY_PATH或LD_PRELOAD几乎是如何做到这一点。为了解决这个问题,从MYPROG重命名你的程序MYPROG-EXE,并创建一个shell脚本,看起来像这样叫MYPROG:

#!/bin/sh 
export LD_LIBRARY_PATH=/path/to/libs:$LD_LIBRARY_PATH 
`dirname $0`/myprog-exe 

这样,当有人运行MYPROG,它才会真正运行shell脚本,然后运行myprog。

1

如果在编译和链接程序时设置环境变量LD_RUN_PATH,则该搜索路径将被烘焙到可执行文件中,动态链接程序将在运行时搜索它。

+0

更好地使用标志而不是环境变量:显式>隐式。 – Tom 2011-06-10 07:43:57