Вопрос или проблема
Я собрал и установил 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, несмотря на то, что вы их установили. Давайте разберемся, как можно решить эту проблему.
Основные шаги для решения проблемы:
-
Проверка установки Boost: Убедитесь, что Boost действительно был установлен. Проверьте наличие соответствующих файлов в
/usr/local/include
(для заголовочных файлов) и в/usr/local/lib
(для библиотек). Вы можете использовать командыls /usr/local/include/boost
иls /usr/local/lib | grep boost
для этого. -
Пути к библиотекам: Возможно, ваш проект ищет библиотеки в неправильных местах. Чтобы убедиться, что ваш компилятор может находить библиотеки 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
Эти переменные среды позволяют компилятору и утилитам сборки находить библиотеки во время компиляции.
-
Установка конфигурационных файлов: Убедитесь, что конфигурация динамической загрузки (для
ld.so
) обновлена. Вы уже добавили строку с путём к Boost в конфигурационный файл, но стоит убедиться, что командаsudo ldconfig
выполнена правильно. -
Конфигурация 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
-
Версия компилятора: Убедитесь, что для компиляции Boost и Mapnik используется одна и та же версия компилятора. Если вы обновили компилятор (например, GCC), укажите его перед сборкой. Например:
export CC=/usr/local/bin/gcc export CXX=/usr/local/bin/g++
-
Логи сборки: Всегда полезно просматривать логи со сборки на наличие ошибок и предупреждений. Эти логи могут дать вам подсказки о том, что конкретно происходит не так во время сборки.
Заключение
Организация работы с библиотеками C++ может быть сложной, особенно когда у вас несколько версий одной библиотеки. Используя приведенные выше советы, вы сможете лучше управлять версиями библиотек и конфигурацией сборки в вашем проекте. Убедитесь, что вы всегда указываете правильные пути к заголовочным файлам и библиотекам, и используете одну и ту же версию компилятора для всех зависимостей.
Если у вас возникнут дополнительные вопросы, не стесняйтесь задавать их!