CentOS не распознает скомпилированную библиотеку Boost

Вопрос или проблема

Я собрал и установил Boost, следуя следующим шагам:

# Установка и сборка
JOBS=`grep -c ^processor /proc/cpuinfo`
wget https://dl.bintray.com/boostorg/release/1.67.0/source/boost_1_67_0.tar.bz2
tar xf boost_1_67_0.tar.bz2
cd boost_1_63_0
./bootstrap.sh
./b2 -d1 -j${JOBS} --with-thread --with-filesystem --with-python --with-regex -sHAVE_ICU=1 --with-program_options --with-system link=shared release toolset=gcc stage
./b2 -d1 -j${JOBS} --with-thread --with-filesystem --with-python --with-regex -sHAVE_ICU=1 --with-program_options --with-system link=shared release toolset=gcc install
sudo bash -c "echo '/usr/local/lib' > /etc/ld.so.conf.d/boost.conf"
sudo ldconfig

Затем я пытаюсь собрать Mapnik, который использует Boost. Я клонирую Mapnik и запускаю ./bootstrap.sh и ./configure. Я получаю ошибку “Не удалось найти необходимый заголовок или библиотеку для Boost filesystem”. Раздел конфигурации Boost выглядит следующим образом:

Ищем библиотеки и заголовки Boost... (кэшировано) 
Найдены библиотеки Boost: mason_packages/.link/lib
Найдены заголовки Boost: mason_packages/.link/include
Проверяем заголовочный файл C++ boost/version.hpp... да
Проверяем версию Boost >= 1.61... да
Найдена версия библиотеки Boost... 
Проверяем библиотеку C++ boost_system... нет
Не удалось найти необходимый заголовок или библиотеку для Boost system
Проверяем библиотеку C++ boost_filesystem... нет
Не удалось найти необходимый заголовок или библиотеку для Boost filesystem
Проверяем библиотеку C++ boost_regex... да
Проверяем библиотеку C++ boost_program_options... да
ValueError: недопустимое значение для int() с основанием 10: '':
  Файл "/root/src/mapnik/SConstruct", строка 1600:
    boost_version = [int(x) for x in env.get('BOOST_LIB_VERSION_FROM_HEADER').split('_')]

(Этапы сборки предоставлены keisan)

Почему система не находит библиотеку Boost 1.67? Я не помню, чтобы устанавливал Boost 1.63. Я собрал и установил 1.67, но система сборки не использует её. Где система ищет Boost на компьютере? Я удалил все файлы libboost_* в /usr/local/lib и /usr/lib64, но всё ещё не знаю, где система ищет Boost. Может кто-то подсказать, как сообщить системе о новом собранном программном обеспечении?

Пользователь Cent OS 7, который также пытается собрать Mapnik с опциональными зависимостями, однако, похоже, у меня обновлённая сборка Boost распознаётся. Вы, вероятно, уже преодолели эту проблему, обошли её или забыли о ней, но я всё же упоминаю об этом, если это может помочь вам или кому-то другому.

Судя по тому, что я читаю, похоже, что Mapnik хочет/нуждается в зависимостях, собранных с помощью того же компилятора, чтобы распознать эти зависимости во время этапов сборки/установки. Однако, если вы используете этот подход, он фактически создает альтернативный, не стандартный компилятор, который нужно указывать в вашей сессии оболочки, чтобы использовать вместо стандартного компилятора.

Я использовал этот подход, чтобы обновить свой компилятор, собрать Boost, а затем сконфигурировать Mapnik. Возможно, это сработает и для вас.

Важно. Обратите внимание на конкретные инструкции export CC= и export CXX=, появляющиеся на втором этапе. Это то место, где вы переопределяете свой стандартный компилятор, и, похоже, большинство/все зависимости необходимо собирать с помощью этого компилятора.

Сначала получите обновлённый компилятор gcc/g++ из серии gcc6 с поддержкой c++14:

## Инструкции изменены отсюда, я просто изменил версию gcc.. 
## https://linuxhostsupport.com/blog/how-to-install-gcc-on-centos-7/
## 
cd /root/downloads
screen -U -S gcc
wget http://ftp.mirrorservice.org/sites/sourceware.org/pub/gcc/releases/gcc-6.5.0/gcc-6.5.0.tar.gz
tar zxf gcc-6.5.0.tar.gz
cd gcc-6.5.0
## Установите bzip2, если у вас его ещё нет..
yum install bzip2
## Установите предварительные требования gcc..
./contrib/download_prerequisites
./configure --disable-multilib --enable-languages=c,c++
make -j 4
make install

Затем соберите и установите Boost из исходников. Этот подход может привести ко второй установке Boost. Но вам нужно знать, где он будет находиться, чтобы указать это во время конфигурации Mapnik:

## Создайте временные ссылки на новые ресурсы компилятора gcc/g++.
## Эти ссылки исчезнут с вашей сессией оболочки, но должны действовать для сборки Boost и Mapnik.
## 
export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++

cd /root/downloads
wget https://dl.bintray.com/boostorg/release/1.69.0/source/boost_1_69_0.tar.gz
tar -xzf boost_1_*
cd boost_1_*
## Эта переменная prefix задает место установки для Boost, зная это местоположение важно. 
## Это было предложенное местоположение согласно инструкциям, которые я следовал, которые потерял, но это кажется стандартным альтернативным местоположением.
./bootstrap.sh --prefix=/opt/boost
./b2 install --prefix=/opt/boost --with=all

Теперь Boost установлен и находится здесь: /opt/boost/

На этом этапе, когда вы собираете и устанавливаете Mapnik, вы можете указать вашу обновлённую версию Boost на этапе конфигурации, как показано ниже.

Это важно— Если вы перезагрузили систему или вышли и снова вошли, вам нужно повторить инструкции export CC= и export CXX=, которые появляются в начале второго шага, чтобы убедиться, что Mapnik собирается с тем же компилятором, который вы использовали для сборки Boost!

./configure BOOST_LIBS=/opt/boost/lib BOOST_INCLUDES=/opt/boost/includes

Надеюсь, это поможет кому-то!

Ответ или решение

Проблема, с которой вы сталкиваетесь, связана с тем, что ваш проект не может найти скомпилированные библиотеки Boost, несмотря на то, что вы их установили. Давайте разберемся, как можно решить эту проблему.

Основные шаги для решения проблемы:

  1. Проверка установки Boost: Убедитесь, что Boost действительно был установлен. Проверьте наличие соответствующих файлов в /usr/local/include (для заголовочных файлов) и в /usr/local/lib (для библиотек). Вы можете использовать команды ls /usr/local/include/boost и ls /usr/local/lib | grep boost для этого.

  2. Пути к библиотекам: Возможно, ваш проект ищет библиотеки в неправильных местах. Чтобы убедиться, что ваш компилятор может находить библиотеки Boost, вы можете добавить их в переменные окружения LD_LIBRARY_PATH и PKG_CONFIG_PATH следующим образом:

    export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
    export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH

    Эти переменные среды позволяют компилятору и утилитам сборки находить библиотеки во время компиляции.

  3. Установка конфигурационных файлов: Убедитесь, что конфигурация динамической загрузки (для ld.so) обновлена. Вы уже добавили строку с путём к Boost в конфигурационный файл, но стоит убедиться, что команда sudo ldconfig выполнена правильно.

  4. Конфигурация Mapnik: При запуске команд ./bootstrap.sh и ./configure для Mapnik вы можете указать пути к библиотекам Boost явно. Это делает настройку более надежной. Используйте флаги, как показано ниже, чтобы указать путь к установленным библиотекам Boost:

    ./configure --with-boost=/usr/local

    Если вы устанавливали Boost в специфическую директорию (например, /opt/boost), укажите её в конфигурации:

    ./configure BOOST_LIBS=/opt/boost/lib BOOST_INCLUDES=/opt/boost/include
  5. Версия компилятора: Убедитесь, что для компиляции Boost и Mapnik используется одна и та же версия компилятора. Если вы обновили компилятор (например, GCC), укажите его перед сборкой. Например:

    export CC=/usr/local/bin/gcc
    export CXX=/usr/local/bin/g++
  6. Логи сборки: Всегда полезно просматривать логи со сборки на наличие ошибок и предупреждений. Эти логи могут дать вам подсказки о том, что конкретно происходит не так во время сборки.

Заключение

Организация работы с библиотеками C++ может быть сложной, особенно когда у вас несколько версий одной библиотеки. Используя приведенные выше советы, вы сможете лучше управлять версиями библиотек и конфигурацией сборки в вашем проекте. Убедитесь, что вы всегда указываете правильные пути к заголовочным файлам и библиотекам, и используете одну и ту же версию компилятора для всех зависимостей.

Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать их!

Оцените материал
Добавить комментарий

Капча загружается...