微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Python 2.7 在 Ubuntu 20.04 中安装 Mapnik 2.2.0

如何解决使用 Python 2.7 在 Ubuntu 20.04 中安装 Mapnik 2.2.0

我正在尝试使用 Python 2.7 在 Ubuntu 20.04 中安装 mapnik。 apt-get install python-mapnik 找不到包。只有 python3-mapnik 可用,但我需要 python2 版本用于遗留巨大的 django 应用程序。

所以我尝试从源安装:

git clone https://github.com/mapnik/mapnik
cd mapnik
git checkout 2.2.x
sudo apt-get install gcc libboost-python-dev libjpeg-dev libsqlite3-dev libxml2-dev libcairo-dev libfreetype6-dev libtiff5-dev libproj-dev libgdal-dev python-cairo-dev g++ libboost-python-dev libboost-all-dev python-dev-is-python2

vi /usr/bin/freetype-config
----
#!/bin/bash
pkg-config freetype2 "$@"
----
chmod a+x /usr/bin/freetype-config
./configure CUSTOM_DEFInes="-DACCEPT_USE_OF_DEPRECATED_PROJ_API_H"

配置与警告一起使用:

检查 boost_regex 是否使用 ICU unicode 支持构建...(缓存)否

.sconf_temp/conftest_17.cpp: In function ‘int main()’:
.sconf_temp/conftest_17.cpp:8:5: error: ‘UnicodeString’ was not declared in this scope; did you mean ‘icu_66::UnicodeString’?
    8 |     UnicodeString ustr;
      |     ^~~~~~~~~~~~~
      |     icu_66::UnicodeString
In file included from /usr/include/unicode/strenum.h:20,from /usr/include/unicode/Locid.h:40,from /usr/include/unicode/coll.h:64,from /usr/include/boost/regex/icu.hpp:25,from .sconf_temp/conftest_17.cpp:3:
/usr/include/unicode/unistr.h:294:20: note: ‘icu_66::UnicodeString’ declared here
  294 | class U_COMMON_API UnicodeString : public Replaceable
      |                    ^~~~~~~~~~~~~
.sconf_temp/conftest_17.cpp:10:56: error: ‘ustr’ was not declared in this scope
   10 |         boost::u32regex pattern = boost::make_u32regex(ustr);
      |                                                        ^~~~
scons: Configure: Checking if boost_regex was built with ICU unicode support...
scons: Configure: (cached) no

无论如何它允许启动make。但 make 失败并出现大量错误

g++ -o bindings/python/mapnik_font_engine.os -c -ansi -Wall -pthread -ftemplate-depth-300 -O3 -fno-strict-aliasing -finline-functions -Wno-inline -Wno-parentheses -Wno-char-subscripts -fPIC -DACCEPT_USE_OF_DEPRECATED_PROJ_API_H -DHAVE_JPEG -DMAPNIK_USE_PROJ4 -DHAVE_PNG -DHAVE_TIFF -DBIGINT -DLINUX -DMAPNIK_THREADSAFE -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -DNDEBUG -DHAVE_CAIRO -DHAVE_PYCAIRO -Ideps -Ideps/clipper/include -Ideps/agg/include -I. -Iinclude -I/usr/include -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/libxml2 -I/usr/include/gdal -I/usr/include/postgresql -I/usr/include/python2.7 -I/usr/include/cairo -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/uuid -I/usr/include/pycairo bindings/python/mapnik_font_engine.cpp

/usr/include/c++/9/bits/c++0x_warning.h:32:2: error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support must be enabled with the -std=c++11 or -std=gnu++11 compiler options.

如果我尝试使用 -std=c++11 手动调用 g++,则会出现另一个错误

g++ -o bindings/python/mapnik_font_engine.os -c -ansi -Wall -pthread -ftemplate-depth-300 -O3 -fno-strict-aliasing -finline-functions -Wno-inline -Wno-parentheses -Wno-char-subscripts -fPIC -DACCEPT_USE_OF_DEPRECATED_PROJ_API_H -DHAVE_JPEG -DMAPNIK_USE_PROJ4 -DHAVE_PNG -DHAVE_TIFF -DBIGINT -DLINUX -DMAPNIK_THREADSAFE -DBOOST_SPIRIT_USE_PHOENIX_V3=1 -DNDEBUG -DHAVE_CAIRO -DHAVE_PYCAIRO -Ideps -Ideps/clipper/include -Ideps/agg/include -I. -Iinclude -I/usr/include -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/libxml2 -I/usr/include/gdal -I/usr/include/postgresql -I/usr/include/python2.7 -I/usr/include/cairo -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/uuid -I/usr/include/pycairo bindings/python/mapnik_font_engine.cpp -std=c++11

  655 | struct to_unicode : public boost::static_visitor<value_unicode_string>
      |                                                                      ^
include/mapnik/value.hpp:659:5: error: ‘value_unicode_string’ does not name a type
  659 |     value_unicode_string operator() (T val) const
      |     ^~~~~~~~~~~~~~~~~~~~
include/mapnik/value.hpp:667:5: error: ‘value_unicode_string’ does not name a type
  667 |     value_unicode_string const& operator() (value_unicode_string const& val) const
      |     ^~~~~~~~~~~~~~~~~~~~
include/mapnik/value.hpp:672:5: error: ‘value_unicode_string’ does not name a type
  672 |     value_unicode_string operator() (value_double val) const
      |     ^~~~~~~~~~~~~~~~~~~~
include/mapnik/value.hpp:679:5: error: ‘value_unicode_string’ does not name a type
  679 |     value_unicode_string operator() (value_null const& val) const
      |     ^~~~~~~~~~~~~~~~~~~~
include/mapnik/value.hpp:688:29: error: ‘value_unicode_string’ has not been declared
st int&; Visitable2 = const int&; typename Visitor::result_type = mapnik::value_adl_barrier::value]’
include/mapnik/value.hpp:895:76:   required from here
/usr/include/boost/variant/detail/apply_visitor_unary.hpp:48:51: error: request for member ‘apply_visitor’ in ‘boost::forward<const int&>((* & visitable))’,which is of non-class type ‘const int’
/usr/include/boost/variant/detail/apply_visitor_unary.hpp: In instantiation of ‘typename Visitor::result_type boost::apply_visitor(Visitor&,Visitable&&) [with Visitor = boost::detail::variant::apply_visitor_binary_unwrap<const mapnik::impl::sub<mapnik::value_adl_barrier::value>,const int&,false>; Visitable = const int&; typename Visitor::result_type = mapnik::value_adl_barrier::value]’:
/usr/include/boost/variant/detail/apply_visitor_binary.hpp:219:32:   required from ‘typename Visitor::result_type boost::apply_visitor(const Visitor&,Visitable1&&,Visitable2&&) [with Visitor = mapnik::impl::sub<mapnik::value_adl_barrier::value>; Visitable1 = const int&; Visitable2 = const int&; typename Visitor::result_type = mapnik::value_adl_barrier::value]’
include/mapnik/value.hpp:901:76:   required from here
/usr/include/boost/variant/detail/apply_visitor_unary.hpp:48:51: error: request for member ‘apply_visitor’ in ‘boost::forward<const int&>((* & visitable))’,Visitable&&) [with Visitor = boost::detail::variant::apply_visitor_binary_unwrap<const mapnik::impl::mult<mapnik::value_adl_barrier::value>,Visitable2&&) [with Visitor = mapnik::impl::mult<mapnik::value_adl_barrier::value>; Visitable1 = const int&; Visitable2 = const int&; typename Visitor::result_type = mapnik::value_adl_barrier::value]’
include/mapnik/value.hpp:907:77:   required from here
/usr/include/boost/variant/detail/apply_visitor_unary.hpp:48:51: error: request for member ‘apply_visitor’ in ‘boost::forward<const int&>((* & visitable))’,Visitable&&) [with Visitor = boost::detail::variant::apply_visitor_binary_unwrap<const mapnik::impl::div<mapnik::value_adl_barrier::value>,Visitable2&&) [with Visitor = mapnik::impl::div<mapnik::value_adl_barrier::value>; Visitable1 = const int&; Visitable2 = const int&; typename Visitor::result_type = mapnik::value_adl_barrier::value]’
include/mapnik/value.hpp:913:76:   required from here
/usr/include/boost/variant/detail/apply_visitor_unary.hpp:48:51: error: request for member ‘apply_visitor’ in ‘boost::forward<const int&>((* & visitable))’,Visitable&&) [with Visitor = boost::detail::variant::apply_visitor_binary_unwrap<const mapnik::impl::mod<mapnik::value_adl_barrier::value>,Visitable2&&) [with Visitor = mapnik::impl::mod<mapnik::value_adl_barrier::value>; Visitable1 = const int&; Visitable2 = const int&; typename Visitor::result_type = mapnik::value_adl_barrier::value]’
include/mapnik/value.hpp:919:76:   required from here
/usr/include/boost/variant/detail/apply_visitor_unary.hpp:48:51: error: request for member ‘apply_visitor’ in ‘boost::forward<const int&>((* & visitable))’,which is of non-class type ‘const int’

请帮忙!这个任务有解决方案吗?如何摆脱所有这些 un​​icode 错误

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。