2009-01-15 173 views
4

所以。我有一个问题,我在机器上有两个版本的GCC。
3.4.6和4.1静态链接到动态库。 glibc

这是由于一些新软件的一些依赖性问题。 (需要glibc 4.1)

当我去链接这个新的软件与4.1库它链接的很好。但是,当执行该软件时,它无法找到该库,因为它正在查看我的LD_LIBRARY_PATH中的3.4.6。如果我将LD_LIBRARY_PATH设置为4.1 lib,那么它会打开shell并杀死其他东西,因为3.4.6库是用于此目的的。

其有点追赶22

是没有什么办法,在链接时,我可以给到共享库的绝对路径,而不使用LD_LIBRARY_PATH?

这种方式我希望可以同时使用这两个版本,但只对这个特定的应用程序使用4.1?

+0

据我所知,没有这样的事,但需要在glibc的较旧版本的程序不应该接受版本太多,因为它是向后兼容的。 – 2009-01-15 20:22:57

回答

7

您的意思是程序启动时使用的绝对路径,当查找库时该路径更受欢迎? rpath就是这样。它将覆盖LD_LIBRARY_PATH中设置的默认搜索路径和内容。只要告诉GCC通过它传递给链接器:

g++ -Wl,-rpath,/usr/lib/my_4.1 -omy_binary *.cpp 

你可以把它给你的搜索处理(使用help,使之提供更多选项):

[[email protected] cpp]$ LD_DEBUG=libs ./a.out 
    5859:  find library=libc.so.6 [0]; searching 
    5859:  search path=/usr/lib/my_4.1/tls/i686/sse2:/usr/lib/my_4.1/tls/i686: 
       /usr/lib/my_4.1/tls/sse2:/usr/lib/my_4.1/tls: 
       /usr/lib/my_4.1/i686/sse2:/usr/lib/my_4.1/i686: 
       /usr/lib/my_4.1/sse2:/usr/lib/my_4.1 (RPATH from file ./a.out) 
    5859:  trying file=/usr/lib/my_4.1/tls/i686/sse2/libc.so.6 
    5859:  .... 
    5859:  search cache=/etc/ld.so.cache 
    5859:  trying file=/lib/libc.so.6 (note: found here!) 
    5859: 
1

不是一个真正的答案你的问题,但一个备用的解决方案:

你应该能够解决您的问题,通过将您的新的lib路径添加到/etc/ld.so.conf和运行ldconfig作为根。

0

你不能为需要它的应用程序设置LD_LIBRARY_PATH吗? 也就是说而不是全局设置它作为一个出口变量,运行程序为

LD_LIBRARY_PATH = /路径/要/ 4.1 /库my_executabel

-k