非系统g ++链接系统库,忽略rpath

时间:2014-05-23 01:49:25

标签: c++ linux gcc g++ libstdc++

我有一个非系统的g ++安装,我正在尝试使用

编译程序
/MYINSTALLDIR/g++ -L/MYINSTALLLIBDIR -Wl,-rpath,MYINSTALLLIBDIR main.cpp -o tester

但是当我运行

ldd ./tester

我知道libstdc ++和其他链接的gcc / g ++库是系统安装而不是指定rpath位置的库。

我已阅读linking g++ 4.8 to libstdc++,我看到的另一个选项是更改g ++规范文件。由于它归root所有,这对我来说会有问题。

有什么建议吗?

(注意,我已检查过LD_LIBRARY_PATH =""我也不想更改LD_LIBRARY_PATH。)

编辑:我试着查看二进制文件中的NEEDED和RPATH字段,它们就是我所期望的。例如,NEEDED包括" libstdc ++"和RPATH只是MYINSTALLLIBDIR的值。

然后我设置了LD_DEBUG =" libs"并在测试仪上重新运行ldd。看起来ldd在系统版本之前看到了正确的库路径,但没有选择它。与libstdc ++相关的输出如下:

    13337:  find library=libstdc++.so.6 [0]; searching
    13337:   search path=/opt/rh/devtoolset-2/root/usr/lib/gcc/x86_64-redhat-linux/4.8.2/tls/x86_64:/opt/rh/devtoolset-2/root/usr/lib/gcc/x86_64-redhat-linux/4.8.2/tls:/opt/rh/devtoolset-2/root/usr/lib/gcc/x86_64-redhat-linux/4.8.2/x86_64:/opt/rh/devtoolset-2/root/usr/lib/gcc/x86_64-redhat-linux/4.8.2 (RPATH from file ./tester)
    13337:    trying file=/opt/rh/devtoolset-2/root/usr/lib/gcc/x86_64-redhat-linux/4.8.2/tls/x86_64/libstdc++.so.6
    13337:    trying file=/opt/rh/devtoolset-2/root/usr/lib/gcc/x86_64-redhat-linux/4.8.2/tls/libstdc++.so.6
    13337:    trying file=/opt/rh/devtoolset-2/root/usr/lib/gcc/x86_64-redhat-linux/4.8.2/x86_64/libstdc++.so.6
    13337:    trying file=/opt/rh/devtoolset-2/root/usr/lib/gcc/x86_64-redhat-linux/4.8.2/libstdc++.so.6
    13336:       13337: find library=libc.so.6 search cache= [/etc/ld.so.cache0]; searching
    13336:   search cache=/etc/ld.so.cache
    13337:    trying file=/usr/lib64/libstdc++.so.6
    13336:       13337:   trying file=

我相信正确的libstdc ++应该是" libstdc ++。所以"在/opt/rh/.../4.8.2文件夹中。没有" libstdc ++。so.6"那里。

编辑:Marc Glisse是对的。结果是新的gcc libstdc ++。所以只选择以前安装的系统版本。所以这似乎是正确的行为。

1 个答案:

答案 0 :(得分:0)

您正在使用Red Hat Developer Toolset中的GCC,它使用一种特殊的链接模型来确保它编译的二进制文件依赖于新的libstdc++.so,正是这样,您不必不必为设置RPATH或LD_LIBRARY_PATH或类似问题而烦恼。 It Just Works™。因此,看到二进制文件取决于系统libstdc++.so.6正是应该发生的情况。

我已将此答案作为另一个类似答案的副本进行了解答,在该答案中,我已经提供了有关如何使用devtoolset链接到libstdc ++的更多详细信息。