- Вопрос или проблема
- Ответ или решение
- Решение проблемы с зависимостями при сборке Mapnik на CentOS 7
- Введение
- Установка необходимых инструментов и библиотек
- Настройка компилятора
- Конфигурация и сборка Boost
- Установка переменной оболочки LD_LIBRARY_PATH
- Запуск конфигурации и сборки Mapnik
- Обработка возможных ошибок
- Заключение
Вопрос или проблема
Я пытаюсь собрать/установить Mapnik (3.0.10) на системе CentOS 7 и у меня возникают проблемы с установкой всех зависимостей.
Я установил компилятор gcc/g++ из серии gcc6, чтобы обеспечить поддержку c++14, которая необходима для Mapnik. Если я укажу путь непосредственно к моему новому gcc
и проверю его версию, я получу следующее:
[root@raven ~]# /usr/local/bin/gcc --version
gcc (GCC) 6.5.0
Copyright (C) 2017 Free Software Foundat/..snip..
Далее я временно переопределил переменные окружения $CC
и $CXX
, чтобы обновленный компилятор использовался для последующих сборок, затем я установил Boost 1.69.0 из исходников, вот так. Обратите внимание, что это фактически устанавливает второй экземпляр Boost, поэтому параметр --prefix
устанавливает, куда будет установлен этот альтернативный Boost:
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_*
./bootstrap.sh --prefix=/opt/boost
./b2 install --prefix=/opt/boost --with=all
Теперь, если я проверю /opt/boost
, я увижу то, что ожидаю..
[root@raven ~]# dir /opt/boost/
include lib
Наконец, я перешел к установке самого Mapnik. Я, по сути, использую подход, упомянутый здесь. Однако у меня уже есть несколько зависимостей, поскольку раньше я устанавливал GDAL и PostGIS. Но, когда я запускаю шаг .configure
для Mapnik, он не может найти мои дополнительные зависимости.
Например, я собрал proj
из исходников и точно знаю, где он находится..
[root@raven ~]# dir /usr/proj49/
bin include lib share
И ldconfig
тоже его находит..
[root@raven mapnik-v3.0.10]# ldconfig -p | grep libproj
libproj.so.12 (libc6,x86-64) => /usr/proj49/lib/libproj.so.12
libproj.so.0 (libc6,x86-64) => /lib64/libproj.so.0
libproj.so (libc6,x86-64) => /usr/proj49/lib/libproj.so
libproj.so (libc6,x86-64) => /lib64/libproj.so
Поэтому я указываю своё альтернативное расположение Boost, а также PROJ_LIBS
и PROJ_INCLUDES
как параметры для .configure
….. но он по-прежнему не может найти proj
? Вот некоторые сокращенные выводы. Обратите внимание, что он находит мой Boost, как указано, но не может найти proj
, несмотря на параметры конфигурации..
[root@raven ~]# cd /root/downloads/mapnik-v3.0.10
[root@raven mapnik-v3.0.10]# ./configure BOOST_LIBS=/opt/boost/lib BOOST_INCLUDES=/opt/boost/includes PROJ_LIBS=/usr/proj49/lib PROJ_INCLUDES=/usr/proj49/include
..snip..
Поиск библиотек и заголовков boost... (кэшировано)
Найдены библиотеки boost: /opt/boost/lib
Найдены заголовки boost: /opt/boost/include
Проверка заголовочного файла C++ boost/version.hpp... да
Проверка версии Boost >= 1.47... да
Найдена версия библиотеки boost... 1_69
..snip..
Проверка библиотеки C proj... нет
Не удалось найти дополнительный заголовок или общую библиотеку для proj
..snip..
Большинство дополнительных зависимостей также, похоже, игнорируются — libpng-devel
, libjpeg-devel
, sqlite3, tiff и др. Большинство из них — это установленные пакеты, а не сборки из исходников.
Поскольку мы будем использовать этот сервер достаточно долго, я хотел бы иметь последнюю версию Mapnik с полным комплектом поддержки (особенно для proj, png и jpeg). Особенно расстраивает, что моя установка proj
не подключается, потому что я точно знаю, где она находится и предоставил Mapnik эти параметры.
Извините за долгий и шумный текст, но кто-нибудь видит, что я упускаю?
[Обновление: 24.04.19 17:00]
Хорошо, я, возможно, разобрался. Я надеялся, что это связано с настройкой окружения/шелла, а не с необходимостью собирать все зависимости из исходников с тем же компилятором, и наткнулся на старое сообщение, где “Dom Lehr” рекомендовал изменить переменную окружения LD_LIBRARY_PATH
, чтобы включить конкретно /usr/local/lib
. Я попробовал это, но это не решило проблему. Однако я оптимистично расширил параметры, чтобы включить некоторые дополнительные местоположения, и теперь я могу завершить шаг .configure
с распознанными всеми зависимостями. Вот как я это сделал..
vi /etc/profile.d/sh.local
# Добавьте пути, разделенные двоеточием, в переменную LD_LIBRARY_PATH вот так..
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib:/usr/local/lib64:/usr/lib:/usr/lib64:
Я добавил все, что мог придумать, где нашел, казалось бы, связанные .so файлы. Сохраните файл, затем..
/sbin/ldconfig
ldconfig
Затем я вышел из своей сеанса терминала и снова вошел, чтобы обновить шелл. Затем дважды проверил, чтобы убедиться, что это сработало:
[root@raven mapnik-v3.0.10]# echo $LD_LIBRARY_PATH
/opt/remi/php70/root/usr/lib64::/usr/local/lib:/usr/local/lib64:/usr/lib:/usr/lib64:
Это сработало. Так что я обновил свои временные аргументы компилятора, перешел в папку с исходным кодом Mapnik и снова запустил инструкцию .configure
, и она сработала без проблем..
export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
cd /root/downloads/mapnik-v3.0.10
./configure BOOST_LIBS=/opt/boost/lib BOOST_INCLUDES=/opt/boost/includes
И это сработало. Теперь, сможет ли оно собраться без проблем, остается загадкой, но, похоже, это сработало!
Что ж, я заговорился. Теперь make
выдает ошибку..
<mapnik::geometry::geometry_collection<double> > >&&’
scons: *** [src/json/mapnik_json_geometry_grammar.o] Ошибка 1
scons: сборка завершена из-за ошибок.
make: *** [src/json/libmapnik-json.a] Ошибка 2
….что соответствует многим другим сообщениям, которые я нашел, где люди сталкиваются с проблемами несовпадения компилятора/зависимостей. Вернемся к началу.
Я наконец все настроил после нескольких попыток и новых стартов. Но я не знаю, были ли они все в конечном счете необходимы, или одно особое изменение исправило ситуацию.
Если бы существовало одно решение, это, возможно, было бы то, что я переключился с сборки mapnik-v3.0.10
, скачанной из AWS S3, на mapnik-v3.0.22
, которая упоминается на домашней странице Mapnik как последняя стабильная версия и загружена напрямую с github.
В любом случае вот что сработало для меня от начала до конца:
Добавьте альтернативный компилятор gcc/g++
Установлен компилятор gcc/g++ из серии gcc6 в альтернативный каталог, чтобы обеспечить поддержку c++14. Он должен быть указан непосредственно из /usr/local/bin
.
yum -y install bzip2
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
./contrib/download_prerequisites
./configure --disable-multilib --enable-languages=c,c++
make -j 4
make install
Удалите и переберите альтернативный Boost
Удалил свою директорию /opt/boost
из предыдущей сборки и переустановил Boost с другими флагами компилятора, как показано в этом скрипте. Как и gcc/g++, этот Boost устанавливается параллельно с системным по умолчанию, и вы найдете его в том месте, куда вы указали его с параметром --prefix
, в моем случае, /opt/boost
.
cd /opt
rm -rf boost
cd /root/downloads
export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
JOBS=`grep -c ^processor /proc/cpuinfo`
./bootstrap.sh --prefix=/opt/boost
./b2 --prefix=/opt/boost -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 --prefix=/opt/boost -j${JOBS} --with-thread --with-filesystem --with-python --with-regex -sHAVE_ICU=1 --with-program_options --with-system toolset=gcc link=shared release install
Странное изменение в файле заголовков Boost
В связи с необычной проблемой компиляции, связанной с Boost >= 1.64, внесите небольшие изменения в файл в пути заголовков Boost, matrix_transformers.hpp
, как предложил Артем здесь:
vi /opt/boost/include/boost/geometry/strategies/transform/matrix_transformers.hpp
i Включите режим ВВОД..
## Измените порядок этих трех строк, близко к верху файла..
## ..snip..
#include <cstddef>
#include <boost/qvm/mat_operations.hpp> <-- Это нужно переместить вверх этой группы.
#include <boost/qvm/mat.hpp>
#include <boost/qvm/mat_access.hpp>
## ..snip..
ESC:x! Сохраните изменения..
[Обновление 18.06.2019] В какое-то время позже я сталкивался с несовпадением зависимостей, и решением было собрать libpng
из исходников, затем указать скрипту конфигурации Mapnik на новый libpng
.
На моей системе сначала мне нужно было удалить старый libpng
, но yum
собирался удалить много других зависимостей тоже. Я смог удалить только libpng
и избежать удаления других зависимостей, выполнив обе эти инструкции.
ПРЕДУПРЕЖДЕНИЕ: Работа вокруг менеджера пакетов — это риск!
rpm -e --nodeps libpng
rpm -e --nodeps libpng-devel
cd /root/downloads
mkdir libpng1616-src
cd libpng1616-src
wget http://downloads.sourceforge.net/libpng/libpng-1.6.16.tar.xz
tar -xf libpng-1.6.16.tar.xz
cd libpng-1.6.16
./configure --prefix=/usr --disable-static &&
make
make check
make install &&
mkdir -v /usr/share/doc/libpng-1.6.16 &&
cp -v README libpng-manual.txt /usr/share/doc/libpng-1.6.16
Вы можете подтвердить его наличие, выполнив..
libpng-config --version
Исправить окружение оболочки
Необходимо установить несколько вещей в системной среде перед тем, как продолжить установку Mapnik.
Установите локальный путь к библиотекам..
cd /etc/ld.so.conf.d/
touch root-local-lib-path.conf
vi /etc/ld.so.conf.d/root-local-lib-path.conf
i Включите режим ВВОД..
## Добавьте эту строку:
/usr/local/lib
ESC:x! Сохраните изменения..
Установите значение LD_LIBRARY_PATH
. Я не уверен, является ли это самым подходящим способом установки этой переменной, но вот что я сделал.
vi /etc/profile.d/sh.local
i Включите режим ВВОД..
## Добавьте эти строки или эквивалентные для ваших системных настроек:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib:/usr/local/lib64:/usr/lib:/usr/lib64:
## Обновление 18.06.2019: Позже я добавил эти две переменные окружения.
## Если вы еще не установили gdal или proj4 (нижеприведенные), было бы лучше установить их сначала, а затем вернуться к этому файлу и добавить их позже.
## Наконец, убедитесь, что эти пути верны для вашей установки!
export GDAL_DATA=/usr/share/gdal
export PROJ_LIB=/usr/share/proj
ESC:x! Сохраните изменения..
Добавить наше альтернативное расположение Boost в окружение. Мне кажется, что это может вызвать неоднозначность с установленным по умолчанию Boost, но в моем случае это, похоже, сработало. Поскольку мы указываем библиотеки/включения Boost в конфигурации Mapnik, это может быть не обязательно.
cd /etc/ld.so.conf.d
touch boost-1.69.0-libs.conf
vi /etc/ld.so.conf.d/boost-1.69.0-libs.conf
i Включите режим ВВОД..
/opt/boost/lib
ESC:x! Сохраните изменения..
ldconfig
Установить различные зависимости Mapnik и собрать Mapnik из исходников
Примечание: Я просто взял эти команды установки из скрипта, уже ссылкуемого выше. Однако я добавил
harfbuzz-devel
, так как, похоже, его не хватало. Но если вы уже установили такие вещи, как GDAL и PostGRESql/PostGIS, вероятно, у вас уже есть несколько из этих зависимостей. Поэтому просмотрите список и удалите что-нибудь, что не соответствует вашей среде.
# Возможно, вам понадобятся пакеты epel для некоторых из этих зависимостей..
yum install epel-release
# Основные зависимости..
yum -y install make gcc47 gcc-c++ bzip2-devel harfbuzz-devel libpng-devel libtiff-devel zlib-devel libjpeg-devel libxml2-devel python-setuptools git-all python-nose python-devel python proj-devel proj proj-epsg proj-nad freetype-devel freetype libicu-devel libicu git bzip2
# Дополнительные зависимости..
yum -y install gdal-devel gdal postgresql-devel sqlite-devel sqlite libcurl-devel libcurl cairo-devel cairo pycairo-devel pycairo postgresql93 postgresql93-server postgresql93-libs postgresql93-contrib postgresql93-devel postgis2_93 vim
# Убедитесь, что альтернативный, обновленный компилятор gcc/g++ по-прежнему указан в окружении!
export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
# Получите исходный код и установите Mapnik
cd /root/downloads
wget https://github.com/mapnik/mapnik/releases/download/v3.0.22/mapnik-v3.0.22.tar.bz2
tar -xf ./mapnik-v3.0.22.tar.bz2
cd mapnik-v3.0.22
# Обновление 18.06.2019: В связи с проблемой с libpng, мне в конечном итоге пришлось пересобрать Mapnik, использовав больше параметров конфигурации, в частности, для PROJ, GDAL, а также PNG.
./configure BOOST_LIBS=/opt/boost/lib BOOST_INCLUDES=/opt/boost/includes PROJ_LIB=/usr/proj49/lib PROJ_INCLUDES=/usr/proj49/include GDAL_LIBS=/usr/lib64 GDAL_INCLUDES=/usr/include/gdal PNG_LIBS=/usr/lib PNG_INCLUDES=/usr/include/libpng16
make
make test ## У меня было несколько ошибок, но я проигнорировал их.. :/
make install
# И установите python bindings, если хотите
yum install python-pip
yum install python-wheel
pip install mapnik
Если вы хотите протестировать свою установку, cd
в папку демо-версии исходников Mapnik и проверьте c++ и/или примеры на python. Обратите внимание на README
файлы в этих папках, так как я думаю, что вы должны собрать демон на c++, прежде чем его сможете протестировать, но вы можете легко использовать Python, просто выполните..
python rundemo.py
..и некоторые изображения должны быть отрендерены в этой директории.
Еще одно “подводное камень”. Если вы ранее установили Mapnik, вы можете заметить, что изображения демо на Python не имеют меток функций! Это не проблема с вашей системой, их на самом деле в данный момент не поддерживают python bindings для Mapnik 3. Однако XML-форматированные декларации стиля работают отлично, поэтому, пока вы используете внешние стили, как например с TileStache, вы не должны испытывать проблем. Но, если вам нужны python bindings для вашего случая использования, вам стоит рассмотреть установку Mapnik 2 в отдельную директорию рядом с Mapnik 3.
На данном этапе, после множества поисков в Google, чтения тем и попыток различных вещей, моя установка, похоже, работает. Так что, надеюсь, это исследование поможет кому-то, кто испытывает трудности с установкой на Cent OS.
Ответ или решение
Решение проблемы с зависимостями при сборке Mapnik на CentOS 7
Введение
Сборка Mapnik (версии 3.0.10) на системе CentOS 7 может быть проблематичной из-за неопознаваемых зависимостей, таких как libpng-devel
, libjpeg-devel
и других. В данной статье мы рассмотрим основные проблемы, которые могут возникнуть при процессе сборки, и предложим последовательные шаги для их решения.
Установка необходимых инструментов и библиотек
Первым шагом в настройке системы для сборки Mapnik является установка базовых инструментов и необходимых библиотек. Для этого выполните следующие команды:
yum -y install make gcc gcc-c++ bzip2-devel
Дополнительно убедитесь, что установлены основные зависимости:
yum -y install libpng-devel libjpeg-devel libtiff-devel gdal-devel proj-devel harfbuzz-devel zlib-devel
Если какие-либо зависимости отсутствуют, установите их с помощью yum
.
Настройка компилятора
Для сборки Mapnik может понадобиться компилятор GCC версии 6 и выше для поддержки C++14. Убедитесь, что у вас установлен правильный компилятор, выполните команду:
/usr/local/bin/gcc --version
Если версия компилятора ниже, вам необходимо установить более новую версию. Не забудьте указать, какой именно компилятор должен использоваться при сборке, установив переменные окружения:
export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
Конфигурация и сборка Boost
Также важно иметь установленную библиотеку Boost, соответствующую вашим требованиям. Например, вы можете установить её с помощью следующей команды:
cd /opt
wget https://dl.bintray.com/boostorg/release/1.69.0/source/boost_1_69_0.tar.gz
tar -xzf boost_1_69_0.tar.gz
cd boost_1_69_0
./bootstrap.sh --prefix=/opt/boost
./b2 install --prefix=/opt/boost --with=all
Установка переменной оболочки LD_LIBRARY_PATH
При сборке Mapnik может потребоваться указать пути к библиотекам. Это можно сделать через переменную окружения LD_LIBRARY_PATH
. Для этого добавьте необходимые пути в файл /etc/profile.d/sh.local
:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib:/usr/local/lib64:/usr/lib:/usr/lib64
Не забудьте выполнить команду ldconfig
для обновления кэша динамических библиотек:
/sbin/ldconfig
Запуск конфигурации и сборки Mapnik
Теперь, когда основные предварительные шаги выполнены, можно приступать к конфигурации источников Mapnik:
cd /root/downloads/mapnik-v3.0.10
./configure BOOST_LIBS=/opt/boost/lib BOOST_INCLUDES=/opt/boost/include PROJ_LIB=/usr/proj49/lib PROJ_INCLUDES=/usr/proj49/include
После успешной конфигурации выполните сборку:
make
make install
Обработка возможных ошибок
Если возникли ошибки во время сборки, обратитесь к журналу ошибок и проверьте всю ли информация о библиотеке и их путях была указана правильно. Учтите, что версии библиотек могут иметь значения, которые влияют на процесс сборки, и могут потребоваться дополнительные изменения в коде, как, например, изменение порядка включения заголовочных файлов в библиотеке Boost.
Заключение
Сборка Mapnik на CentOS 7 представляет собой требовательный процесс, учитывающий множество зависимостей и требований к компиляции. Следуйте по данному руководству, и учитывайте предостережения, чтобы обеспечить успешную установку и избежать распространенных ошибок. Вовремя проверяйте каждую стадию установки, что поможет вам быстрее устранить потенциальные проблемы и получить работоспособную сборку Mapnik.