我在系统4.6.2和4.7.0上安装了两个版本的GCC。我正在运行Fedora Core 16。

4.6.2安装在/usr/bin中,而4.7.0安装在/home/nerozehl/local/bin中。 C++的库和运行时也已编译并安装在/home/nerozehl/local/lib/home/nerozehl/local/lib64中。

我还安装了两个版本的Boost,带有/usr/lib64/home/nerozehl/local/lib中的库。 (分别提升1.47.0和1.49.0)

我遇到的问题是g++/ld链接了默认库,而不是/home/nerozehl/local中的较新库。我正在使用configure生成Makefile,并以这种方式调用它:

CXX=g++47 CXXFLAGS="-g -O0 -pg" LDFLAGS="-L/home/nerozehl/local/lib" ./configure --prefix=/home/nerozehl/local
g++47驻留在/home/nerozehl/local/bin(在我的$PATH中)中。

当我编译时,一切都很好,并且使用了较新的头,但是当我检查它的链接对象时:
ldd source/noes
    linux-vdso.so.1 =>  (0x00007fffebfff000)
    libboost_filesystem-mt.so.1.47.0 => /usr/lib64/libboost_filesystem-mt.so.1.47.0 (0x0000003c6a800000)
    libboost_system-mt.so.1.47.0 => /usr/lib64/libboost_system-mt.so.1.47.0 (0x0000003c6a400000)
    libboost_program_options-mt.so.1.47.0 => /usr/lib64/libboost_program_options-mt.so.1.47.0 (0x0000003c6ac00000)
    libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003c6dc00000)
    libm.so.6 => /lib64/libm.so.6 (0x0000003c68c00000)
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003c69c00000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003c68800000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003c69000000)
    librt.so.1 => /lib64/librt.so.1 (0x0000003c69800000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003c68400000)

为了我的一生,我不知道如何强制g++/ld/configure使用我的较新的库。任何帮助,将不胜感激。

最佳答案

ldd不会告诉您可执行文件所链接的对象,而是告诉您可执行文件在运行时将加载哪些共享对象。如果希望它在运行时从/home/nerozehl加载,则需要执行以下操作之一:

  • 在运行程序
  • 时将LD_LIBRARY_PATH设置为包含/home/nerozehl/local/lib
  • 将/home/nerozehl/local/lib添加到ld.so.conf,以便每个人都可以使用。但是,仅适用于使用ld.so.conf的系统(例如linux)。
  • -Wl,-rpath,/home/nerozehl/local/lib链接程序。但是,仅在使用ELF或其他支持ELF的可执行文件格式的系统上工作。它还将路径硬编码到可执行文件中,这有点脆弱-如果将可执行文件移动到另一台计算机或重新排列文件系统,则它可能会损坏。
  • 关于c++ - GCC未链接正确的库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9549398/

    10-11 04:05