3

我正在学习 POCO 项目网站上的第一步教程,并且我已经在我的主目录下成功构建了库(Debian Linux,2.6.26,gcc 4.3.2)

〜/开发/ POCO

与位于的共享库

~/开发/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 => 未找到
        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++ [废话] -L/home/npalko/Development/POCO/lib/Linux/x86_64
           -lPoco基金会

我试过设置

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

4

3 回答 3

8

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

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

这有效地硬编码了可执行文件中的路径,因此它可能适合也可能不适合您的目的。

于 2009-09-26T00:05:40.263 回答
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

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

于 2009-09-25T23:44:12.037 回答
1

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

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

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

-rpath是链接器选项

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

于 2009-09-27T12:38:15.247 回答