CentOS 7: При сборке Mapnik шаг конфигурации не находит необязательные зависимости, такие как libpng-devel, libjpeg-devel и т.д.

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

Я пытаюсь собрать/установить 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

Собрать libpng из исходников

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.

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

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