首页 文章

Linux运行时链接器错误

提问于
浏览
2

我正在POCO项目网站上的First Steps教程,我已经在我的主目录下成功构建了库(Debian Linux,2.6.26,gcc 4.3.2)

~/Development/POCO

共享库位于

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

My problem is that any application I build that depends on these libraries can only be run from the shared library directory.

~/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

查看make进程的输出,正确指定了目录

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

我试过设定

LD_LIBRARY_PATH

/home/npalko/Development/POCO/lib/Linux/x86_64

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

3 回答

  • 1

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

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

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

  • 7

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

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

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

    -rpath 是链接器选项

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

  • 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
    

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

相关问题