GCC Не связывает правильные библиотеки - PullRequest
9 голосов
/ 04 марта 2012

В моей системе установлены две версии GCC 4.6.2 и 4.7.0.Я использую 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 для генерации Make-файлов и называю это так:

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 для использования моих новых библиотек.Любая помощь будет оценена.

Ответы [ 2 ]

10 голосов
/ 04 марта 2012

ldd не сообщает вам, с чем был связан исполняемый файл - он сообщает, какие общие объекты будет загружен исполняемым файлом при запуске. Если вы хотите, чтобы он загружался из / home / nerozehl при запуске, вам нужно сделать одну из следующих вещей:

  • установите LD_LIBRARY_PATH на / home / nerozehl / local / lib при запуске программы

  • добавьте / home / nerozehl / local / lib в ld.so.conf, чтобы все привыкли. Однако работает только на системах (таких как linux), которые используют ld.so.conf.

  • свяжет программу с -Wl,-rpath,/home/nerozehl/local/lib. Однако работает только в системах, использующих ELF или другой исполняемый формат, который его поддерживает. Он также жестко кодирует путь в исполняемый файл, что несколько хрупко - если вы переместите исполняемый файл на другой компьютер или переставите файловую систему, он может сломаться.

1 голос
/ 04 марта 2012

Вы уверены, что ваш скрипт настройки обращает внимание на LDFLAGS?Запустите ./configure --help и посмотрите параметры.Обычно есть что-то вроде --with-boost =, и затем вы указываете каталог, в котором находится boost.Попробуйте это вместо этого.Аналогично для любых других вариантов, с которыми у вас возникают проблемы.

...