如何更改库包含来自bash的二进制文件的路径?

时间:2011-02-04 08:40:37

标签: c++ linux bash include-path kde4

我在Kubuntu上正确安装了一个软件。

现在,我正在修补和测试它的一些库。

如何从bash启动软件,以便加载我的修补库而不是官方库?

例如为:
官方库位于/ usr / lib /
我的补丁库(在测试开发期间使用)位于/ home / user / dev / lib /

我试过了:

$ set LD_LIBRARY_PATH=/home/user/dev/lib/  
$ binary_app &

但无济于事。

我更喜欢可以从bash设置的解决方案,但如果不可能,我也可以修改这个C ++软件的cmake文件。

目的是允许我使用vanilla libs轻松启动应用程序,或者使用我的修补库来查看差异。

编辑:这是一个KDE .so文件

我正在测试的库是一个KDE4库。官方lib位于/ usr / lib / kde4 /中。在该目录中,库中没有一个以 lib 前缀开头。

我是否:

/lib/ld-linux-x86-64.so.2 --list  --library-path PATH EXEC  

ldd EXEC  

图书馆根本没有列出。

另一方面,如果将原始库从/ usr / lib / kde4 /移开,则应用程序启动但缺少相应的功能。

KDE4库是否以特定方式加载?也许要设置的变量是不同的......

修改2

所有答案都很好且有用......不幸的是,事实证明问题似乎与lib路径设置无关。我正在处理插件架构,并且.so加载路径似乎在应用程序的某处硬编码。我需要在源代码中花费更多时间来了解正在发生的事情......谢谢,并且+1给所有人。

5 个答案:

答案 0 :(得分:7)

来自'man bash':

  

当一个简单的命令而不是内置函数或shell函数时   被执行,它被调用   单独的执行环境   由以下内容组成。除非   另外注意到,值是   继承自shell。

     

[...]

     

·标记为导出的shell变量和函数        用于导出的变量   命令,在环境中传递

如果要执行的程序可以看到变量,则需要“导出”变量。

但是,您也可以尝试以下方法:

  

/lib/ld-linux.so.2 --library-path PATH EXECUTABLE

请参阅http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

答案 1 :(得分:5)

尝试export LD_LIBRARY_PATH=...而不是设置。

答案 2 :(得分:3)

我已经把它放在评论中但是在考虑之后我认为最好的方法(使用不同的库仅用于测试/调试)是使用LD_PRELOAD,请参阅What is the LD_PRELOAD trick?

从手册页:

  

<强> LD_PRELOAD

     

以空格分隔的列表,其中包含要在所有其他库之前加载的其他用户指定的ELF共享库。这可用于有选择地覆盖其他共享库中的函数。对于set-user-ID / set-group-ID ELF二进制文件,只会加载标准搜索目录中也是set-user-ID的库。

更新

在更新的问题之后,应用程序似乎正在使用dlopen使用绝对路径打开库。我认为你无能为力。见man dlopen

UPDATE2:

也许你可以做些什么:你可能LD_PRELOAD你自己的dlopen函数修改了你自己的库的路径......

答案 3 :(得分:2)

你不是偶然的应用程序setuid或setgid吗?在这种情况下,LD_LIBRARY_PATH将被忽略。

答案 4 :(得分:2)

将所有内容放在一行:

LD_LIBRARY_PATH=foo binary_app&