我的系统上有多个应用程序版本(一个开发版本和多个较早发布的版本)。当我尝试运行较旧的版本时,系统总是会从开发版本中获取动态库。
这是/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
确保
/home/franz/Projects/appleseed/archives/releases/1.1.0-alpha-14-0-g4e46ed9/appleseed/bin
您确实有要加载的共享库。它们真的在
bin/
档案目录中吗?没有lib/
?尝试
/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 提供的扫描位置。