How to build Mapnik as libmapnik.a on CentOS 7?
I noticed there is logic for building statically in src/build.py, but when building, it gives me the following error
scons: *** Two environments with different actions were specified for the same target: /home/xxx/third_party_src/mapnik/plugins/input/csv/csv_utils.o
(action 1: g++ -o csv_utils.o -c -std=c++11 -g -D_GLIBCXX_USE_CXX11_ABI=0 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -Wall -pthread -ftemplate-depth-300 -Wsign-compare -Wshadow -O3 -fPIC -rdynamic -DMAPNIK_MEMORY_MAPPED_FILE -DMAPNIK_HAS_DLCFN -DBIGINT -DBOOST_REGEX_HAS_ICU -DHAVE_JPEG -DMAPNIK_USE_PROJ4 -DHAVE_PNG -DHAVE_WEBP -DHAVE_TIFF -DLINUX -DMAPNIK_THREADSAFE -DBOOST_SPIRIT_NO_PREDEFINED_TERMINALS=1 -DBOOST_PHOENIX_NO_PREDEFINED_TERMINALS=1 -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -DNDEBUG -DMAPNIK_STATIC_PLUGIN_CSV -DMAPNIK_STATIC_PLUGIN_GDAL -DMAPNIK_STATIC_PLUGIN_GEOJSON -DMAPNIK_STATIC_PLUGIN_OGR -DMAPNIK_STATIC_PLUGIN_PGRASTER -DMAPNIK_STATIC_PLUGIN_POSTGIS -DMAPNIK_STATIC_PLUGIN_RASTER -DMAPNIK_STATIC_PLUGIN_SHAPE -DMAPNIK_STATIC_PLUGIN_SQLITE -DMAPNIK_STATIC_PLUGIN_TOPOJSON -DMAPNIK_STATIC_PLUGINS -DHAVE_CAIRO -DGRID_RENDERER -DSVG_RENDERER csv_utils.cpp)
(action 2: g++ -o csv_utils.o -c -std=c++11 -g -D_GLIBCXX_USE_CXX11_ABI=0 -fPIC -fvisibility=hidden -fvisibility-inlines-hidden -Wall -pthread -ftemplate-depth-300 -Wsign-compare -Wshadow -O3 -rdynamic -DMAPNIK_MEMORY_MAPPED_FILE -DMAPNIK_HAS_DLCFN -DBIGINT -DBOOST_REGEX_HAS_ICU -DHAVE_JPEG -DMAPNIK_USE_PROJ4 -DHAVE_PNG -DHAVE_WEBP -DHAVE_TIFF -DLINUX -DMAPNIK_THREADSAFE -DBOOST_SPIRIT_NO_PREDEFINED_TERMINALS=1 -DBOOST_PHOENIX_NO_PREDEFINED_TERMINALS=1 -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -DNDEBUG csv_utils.cpp)
File "/home/xxx/third_party_src/mapnik/utils/mapnik-index/build.py", line 56, in
"If I want to build it as libmapnik.a, what should I do?"
Hello, I can't tell which version you're trying to build, but here's an example of how I build v3.1.0 on CentOS 7:
export mapnik_version=3.1.0
mkdir --parents /tmp/mapnik_src
cd /tmp/mapnik_src
yum --assumeyes install epel-release centos-release-scl
yum --assumeyes upgrade
yum --assumeyes install \
boost169-devel \
bzip2 \
cairo-devel \
freetype-devel \
devtoolset-9-gcc \
devtoolset-9-gcc-c++ \
gdal-devel \
harfbuzz-devel \
libicu-devel \
libjpeg-devel \
libpng-devel \
libtiff-devel \
libwebp-devel \
libxml2-devel \
make \
patch \
postgresql-devel \
proj-devel \
python3 \
sqlite-devel \
tar \
zlib-devel
export DESTDIR="/tmp/mapnik"
export GDAL_DATA="$(gdal-config --datadir)"
export JOBS="$(nproc)"
export PROJ_LIB="/usr/share/proj"
export PYTHON="python3"
mkdir --parents ${GDAL_DATA} ${PROJ_LIB}
if [ ! -f SConstruct ]; then \
curl --silent --location https://github.com/mapnik/mapnik/releases/download/v${mapnik_version}/mapnik-v${mapnik_version}.tar.bz2 \
| tar --extract --bzip2 --strip-components=1 --file=-
sed -i 's#BOOST_APPEND = match.groups()\[0\]#BOOST_APPEND = ""#g' SConstruct
fi
source /opt/rh/devtoolset-9/enable
export CUSTOM_DEFINES="-DACCEPT_USE_OF_DEPRECATED_PROJ_API_H"
export CUSTOM_LDFLAGS="-L/usr/lib64/boost169"
bash configure \
CPP_TESTS=False \
CUSTOM_CFLAGS="${CUSTOM_CFLAGS:-}" \
CUSTOM_CXXFLAGS="${CUSTOM_CXXFLAGS:-}" \
CUSTOM_DEFINES="${CUSTOM_DEFINES:-}" \
CUSTOM_LDFLAGS="${CUSTOM_LDFLAGS:-}" \
DEMO=False \
DESTDIR="${DESTDIR}" \
FAST=True \
INPUT_PLUGINS=all \
LIBDIR_SCHEMA=lib64 \
OPTIMIZATION=2 \
PREFIX=/usr \
SVG2PNG=True \
XMLPARSER=libxml2
make PYTHON="${PYTHON}"
At this point, libmapnik.a does not exist.
find . -name libmapnik.a
Initially configuring with LINKING=static seems to cause the build to fail, however, when running the last two commands again with LINKING=static it does build libmapnik.a successfully.
bash configure \
CPP_TESTS=False \
CUSTOM_CFLAGS="${CUSTOM_CFLAGS:-}" \
CUSTOM_CXXFLAGS="${CUSTOM_CXXFLAGS:-}" \
CUSTOM_DEFINES="${CUSTOM_DEFINES:-}" \
CUSTOM_LDFLAGS="${CUSTOM_LDFLAGS:-}" \
LINKING=static \
DEMO=False \
DESTDIR="${DESTDIR}" \
FAST=True \
INPUT_PLUGINS=all \
LIBDIR_SCHEMA=lib64 \
OPTIMIZATION=2 \
PREFIX=/usr \
SVG2PNG=True \
XMLPARSER=libxml2
make PYTHON="${PYTHON}"
find . -name libmapnik.a
./src/libmapnik.a
您好,我不知道您要构建哪个版本,但这是我如何
v3.1.0在 CentOS 7 上构建的示例:export mapnik_version=3.1.0 mkdir --parents /tmp/mapnik_src cd /tmp/mapnik_src yum --assumeyes install epel-release centos-release-scl yum --assumeyes upgrade yum --assumeyes install \ boost169-devel \ bzip2 \ cairo-devel \ freetype-devel \ devtoolset-9-gcc \ devtoolset-9-gcc-c++ \ gdal-devel \ harfbuzz-devel \ libicu-devel \ libjpeg-devel \ libpng-devel \ libtiff-devel \ libwebp-devel \ libxml2-devel \ make \ patch \ postgresql-devel \ proj-devel \ python3 \ sqlite-devel \ tar \ zlib-devel export DESTDIR="/tmp/mapnik" export GDAL_DATA="$(gdal-config --datadir)" export JOBS="$(nproc)" export PROJ_LIB="/usr/share/proj" export PYTHON="python3" mkdir --parents ${GDAL_DATA} ${PROJ_LIB} if [ ! -f SConstruct ]; then \ curl --silent --location https://github.com/mapnik/mapnik/releases/download/v${mapnik_version}/mapnik-v${mapnik_version}.tar.bz2 \ | tar --extract --bzip2 --strip-components=1 --file=- sed -i 's#BOOST_APPEND = match.groups()\[0\]#BOOST_APPEND = ""#g' SConstruct fi source /opt/rh/devtoolset-9/enable export CUSTOM_DEFINES="-DACCEPT_USE_OF_DEPRECATED_PROJ_API_H" export CUSTOM_LDFLAGS="-L/usr/lib64/boost169" bash configure \ CPP_TESTS=False \ CUSTOM_CFLAGS="${CUSTOM_CFLAGS:-}" \ CUSTOM_CXXFLAGS="${CUSTOM_CXXFLAGS:-}" \ CUSTOM_DEFINES="${CUSTOM_DEFINES:-}" \ CUSTOM_LDFLAGS="${CUSTOM_LDFLAGS:-}" \ DEMO=False \ DESTDIR="${DESTDIR}" \ FAST=True \ INPUT_PLUGINS=all \ LIBDIR_SCHEMA=lib64 \ OPTIMIZATION=2 \ PREFIX=/usr \ SVG2PNG=True \ XMLPARSER=libxml2 make PYTHON="${PYTHON}"此时,
libmapnik.a不存在。find . -name libmapnik.a最初配置
LINKING=static似乎会导致构建失败,但是,当再次运行最后两个命令时,LINKING=static它确实构建libmapnik.a成功。bash configure \ CPP_TESTS=False \ CUSTOM_CFLAGS="${CUSTOM_CFLAGS:-}" \ CUSTOM_CXXFLAGS="${CUSTOM_CXXFLAGS:-}" \ CUSTOM_DEFINES="${CUSTOM_DEFINES:-}" \ CUSTOM_LDFLAGS="${CUSTOM_LDFLAGS:-}" \ LINKING=static \ DEMO=False \ DESTDIR="${DESTDIR}" \ FAST=True \ INPUT_PLUGINS=all \ LIBDIR_SCHEMA=lib64 \ OPTIMIZATION=2 \ PREFIX=/usr \ SVG2PNG=True \ XMLPARSER=libxml2 make PYTHON="${PYTHON}"find . -name libmapnik.a ./src/libmapnik.a
Thank you very much for your patient explanation. I am using version 3.0.19. Following the method you provided, I have successfully obtained the libmapnik.a file. Thanks