我正在尝试在本地 Linux Mint 21.2 机器上从源代码构建 Mapnik(GitHub 上的源代码。
编译时,因错误而停止。
include/mapnik/filesystem.hpp:38:21: error: expected namespace name
namespace fs = std::filesystem;
~~~~~^
include/mapnik/filesystem.hpp:39:25: error: no type named 'error_code' in namespace 'std'
using error_code = std::error_code;
~~~~~^
src/fs.cpp:40:12: error: use of undeclared identifier 'fs'
return fs::exists(filepath);
^
之后还有更多错误,但这就是问题的开始。
编辑:之前还有很多关于一元函数被弃用的警告。
In file included from mason_packages/.link/include/boost/type_index/stl_type_index.hpp:47:
mason_packages/.link/include/boost/container_hash/hash.hpp:131:33: warning: 'unary_function<std::type_index, unsigned long>' is deprecated [-Wdeprecated-declarations]
struct hash_base : std::unary_function<T, std::size_t> {};
^
我尝试按照 Mapnik Linux 安装指南
中的说明进行操作他们特别警告需要一个符合 C++14 标准的最新编译器。所以我怀疑这与我使用错误的编译器有关。
我成功添加了
ubuntu-toolchain-r/test
PPA 以安装最新的编译器版本。但是:当我尝试安装gcc-6
时,它说没有这样的包,但它被另一个包引用了。我很困惑。我认为 gcc-6
太旧了,无法再包含在 PPA 中,因为当前版本是 gcc-12
,但也许在编写安装 Wiki 时它就是最新版本。
所以我认为我当前版本的
gcc
、clang
和 g++
可能已经足够新了,因为该安装页面上次更新是在 2020 年。
这些是我的版本:
gcc -v
:gcc版本11.4.0(Ubuntu 11.4.0-1ubuntu1~22.04)g++ -v
:显然是gcc
clang -v
:Ubuntu clang 版本 14.0.0-1ubuntu1.1所以我的问题是:上述错误是否是由于使用不理解这些行的不适当的编译器而引入的?
因此,我认为这是一个c++问题,因为有些人可能知道这种错误。
我通过使用
C++17
标准而不是默认的 C++14
标准进行编译,成功地完全避免了错误。
如何在配置过程中设置此标志:
./configure CXX_STD="17"
请参阅 Mapnik Repo 上的第 4405 期问题查看整个斗争过程。不幸的是,为了获得功能完整的构建,需要额外的补丁。