2009-09-25 52 views
2

我的工作虽然First Steps教程在POCO项目工地,我已经成功地构建了库(Debian的Linux中,2.6.26,GCC 4.3.2),我的主目录下的Linux运行时链接错误

~/Development/POCO

与位于

~/Development/POCO/lib/Linux/x86_64/lib

我的问题的共享库是我建立的任何应用程序依赖这些库只能从共享库目录中运行。

 
~/Development/POCO/lib/Linux/x86_64$ ldd ~/Development/Cloud/DateTimeSample/bin/Linux/x86_64/DateTime 
     linux-vdso.so.1 => (0x00007fffe69fe000) 
     libPocoFoundation.so.6 (0x00007fa8de44f000) 
     libpthread.so.0 => /lib/libpthread.so.0 (0x00007fa8de233000) 
     libdl.so.2 => /lib/libdl.so.2 (0x00007fa8de02f000) 
     librt.so.1 => /lib/librt.so.1 (0x00007fa8dde26000) 
     libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007fa8ddb1a000) 
     libm.so.6 => /lib/libm.so.6 (0x00007fa8dd897000) 
     libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007fa8dd680000) 
     libc.so.6 => /lib/libc.so.6 (0x00007fa8dd32d000) 
     /lib64/ld-linux-x86-64.so.2 (0x00007fa8de7e0000) 

并且从该目录运行DateTime将按您的预期工作。然而

 
~/Development/Cloud/DateTimeSample/bin/Linux/x86_64$ ldd DateTime 
     linux-vdso.so.1 => (0x00007fff24dfe000) 
     libPocoFoundation.so.6 => not found 
     libpthread.so.0 => /lib/libpthread.so.0 (0x00007ffc1c7dd000) 
     libdl.so.2 => /lib/libdl.so.2 (0x00007ffc1c5d9000) 
     librt.so.1 => /lib/librt.so.1 (0x00007ffc1c3d0000) 
     libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00007ffc1c0c4000) 
     libm.so.6 => /lib/libm.so.6 (0x00007ffc1be41000) 
     libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007ffc1bc2a000) 
     libc.so.6 => /lib/libc.so.6 (0x00007ffc1b8d7000) 
     /lib64/ld-linux-x86-64.so.2 (0x00007ffc1c9f9000) 

因此在运行任何其他目录的结果中可执行

 
error while loading shared libraries: libPocoFoundation.so.6: cannot open shared object file: No such file or directory 

望着从化妆过程的输出,该目录正确指定

 
g++ [blah] -L/home/npalko/Development/POCO/lib/Linux/x86_64 
      -lPocoFoundation 

我试着将

LD_LIBRARY_PATH
设置为
/home/npalko/Development/POCO/lib/Linux/x86_64
,但它没有改变任何东西。任何帮助将不胜感激!

+0

啊,我的问题是,我已经错误地设置LD_LIBRARY_PATH。更多的是对Bash的误解,而不是其他任何事情。非常感谢你的帮助! – 2009-09-30 19:37:47

回答

6

如果您不想处理LD_LIBRARY_PATH变量,则可以将链接器-rpath选项添加到gcc命令行。在你的情况,这将是:

gcc ... -Wl,-rpath=/home/npalko/Development/POCO/lib/Linux/x86_64 

这有效地在硬编码的可执行文件路径,因此它可能会或可能不适合你的目的。

+0

美丽,谢谢! – 2009-09-30 19:38:22

2

这会失败吗?

LD_LIBRARY_PATH=/home/npalko/Development/POCO/lib/Linux/x86_64 ~/Development/Cloud/DateTimeSample/bin/Linux/x86_64/DateTime 

只是想你可能没有正确设置LD_LIBRARY_PATH

这个呢?

ls -alh /home/npalko/Development/POCO/lib/Linux/x86_64/libPocoFoundation.so 

如果两者都失败,我看不到原因。

+1

设置LD_LIBRARY_PATH通常是一个坏主意:您的二进制文件适用于您(有时)但不适合您的朋友,或者您忘记在演示文稿之前设置它。在静态链接时使用-rpath通常是更好的选择。 – 2009-09-26 23:02:36

1

您必须指定链接库的路径

g++ [blah] -Wl,-rpath=/home/npalko/Development/POCO/lib/Linux/x86_64 

-Wl意味着你将一个选项传递给连接器

-rpath是连接选项

将目录添加到运行时库搜索路径。链接ELF可执行文件与共享对象时,这用于 。所有-rpath 参数被连接并传递给运行时链接程序,该链接程序在运行时使用它们来定位共享对象。-rpath选项 也用于查找明确包含在链接中的共享对象所需的共享对象;

+0

+1。拉着我的头发试图找出如何使用-R链接时gcc调用链接器。你的回答比公认的答案要好得多。谢谢! – jj33 2010-12-08 15:39:24

相关问题