Linux运行时链接程序错误

我正在通过POCO Project站点上的第一步教程工作,并且已经成功地在我的主目录下构build了这个库(Debian Linux,2.6.26,gcc 4.3.2)

  〜/开发/ POCO 

与共享库位于

  〜/开发/ POCO / lib中/ Linux的/ x86_64的/ lib目录 

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

 〜/ 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 =>未find
         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)

所以从其他目录运行可执行文件会导致

加载共享库时出错:libPocoFoundation.so.6:无法打开共享目标文件:没有这样的文件或目录

查看make过程的输出,目录是正确指定的

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

我试过设置

LD_LIBRARY_PATH 

  /家庭/ npalko /开发/ POCO / lib中/ Linux的/ x86_64的 

,但它没有改变任何东西。 任何帮助将不胜感激!

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

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

这有效地硬编码在可执行文件中的路径,所以它可能会或可能不适合您的目的。

这失败了?

 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 

如果两者都失败,我看不出有什么理由。

您必须指定链接器库的路径

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

-Wl表示您向链接器传递选项

-rpath是链接器选项

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