在从终端运行应用程序之前设置 LD_LIBRARY_PATH 无效

在从终端运行应用程序之前设置 LD_LIBRARY_PATH 无效

我的系统上有多个应用程序版本(一个开发版本和多个较早发布的版本)。当我尝试运行较旧的版本时,系统总是会从开发版本中获取动态库。

这是/home/franz/Projects/appleseed/archives/releases/1.1.0-alpha-14-0-g4e46ed9/appleseed/bin我正在尝试运行的旧版本的目录:

$ ldd appleseed.studio 
    [stuff omitted]
libappleseed.so => /home/franz/Projects/appleseed/build/linux-gcc4/appleseed/libappleseed.so (0x00007fbcb090b000)
libappleseed.shared.so => /home/franz/Projects/appleseed/build/linux-gcc4/appleseed.shared/libappleseed.shared.so (0x00007fbcb030c000)
    [more stuff omitted]

/home/franz/Projects/appleseed/build/linux-gcc4/appleseed/是我的开发版本的路径。)

LD_LIBRARY_PATH当然,在运行旧版本之前我应该​​正确设置:

$ export LD_LIBRARY_PATH=/home/franz/Projects/appleseed/archives/releases/1.1.0-alpha-14-0-g4e46ed9/appleseed/bin ; ./appleseed.studio

LD_LIBRARY_PATH最初是空的,所以我不关心连接。)

然而,这不起作用,系统继续选择动态库的开发版本。

我做错了什么吗?有什么想法吗?

我正在运行 64 位版本的 Ubuntu 10.10 Maverick Meerkat(自 2012 年 4 月起不再受支持)。

更新:我已将我的系统更新至 Ubuntu 11.10(Natty),但问题仍然存在。

答案1

  1. 确保

    /home/franz/Projects/appleseed/archives/releases/1.1.0-alpha-14-0-g4e46ed9/appleseed/bin
    

    您确实有要加载的共享库。它们真的在bin/档案目录中吗?没有lib/

  2. 尝试

    /lib/ld-linux.so.2 --library-path /home/franz/Projects/appleseed/archives/releases/1.1.0-alpha-14-0-g4e46ed9/appleseed/bin ./appleseed.studio
    

    您可以使用该程序的选项来控制和调试库加载过程。

答案2

对于 64 位,/usr/bin/ld -> x86_64-linux-gnu-ld 是加载器,而不是 32 位 /lib/ld-linux.so.2 -> i386-linux-gnu/ld-2.27.so。这不需要 32 位加载器。

ldd 命令指示它使用的共享库位于 .../appleseed 和 .../appleseed.shared 中。为所需库添加新位置(.../bin)不会改变这一点,也不会拾取 .../bin 中的库。剩下的问题是,如果这些库不在标准位置也不在 LD_LIBRARY_PATH 中,ldd 将如何拾取这些库。我会检查可执行文件的链接方式,您可以给出所需库的完整路径,而不是仅仅依赖名称,需要一组 LD_LIBRARY_PATH 提供的扫描位置。

相关内容