在 Ubuntu 14.04 上编译 EOS 时缺少 C++ std 库方法和其他错误?

Missing C++ std library methods and other errors while compiling EOS on Ubuntu 14.04?

我正在尝试在 Ubuntu 14.04 上 GitHub 上编译 EOS blockchain/smart 合约项目:

https://github.com/EOSIO/eos

安装Clang 4.0后,安装build_essentials,升级CMake 到 3.5,我能够 运行 构建过程而不会丢失任何依赖项。但是,现在我在构建 EOS 源代码时收到如下所示的错误。在我看来,这似乎是我系统上工具配置的另一个普遍问题,因为很多人都能够编译 EOS 代码,尽管通常在 Ubuntu 14.04.

任何人都可以通过查看错误来判断我正在获取我需要安装或升级的工具或库吗?

In file included from /usr/lib/llvm-4.0/include/clang/AST/Decl.h:31:
/usr/lib/llvm-4.0/include/llvm/Support/TrailingObjects.h:259:33: error: 'BaseTy' does not refer to a value
    static_assert(LLVM_IS_FINAL(BaseTy), "BaseTy must be final.");
                            ^
/usr/lib/llvm-4.0/include/llvm/Support/TrailingObjects.h:233:20: note: declared here
template <typename BaseTy, typename... TrailingTys>
               ^
/usr/lib/llvm-4.0/include/llvm/Support/TrailingObjects.h:259:19: error: expected expression
    static_assert(LLVM_IS_FINAL(BaseTy), "BaseTy must be final.");
              ^
/usr/lib/llvm-4.0/include/llvm/Support/type_traits.h:104:45: note: expanded from macro 'LLVM_IS_FINAL'
#define LLVM_IS_FINAL(Ty) std::is_final<Ty>()
                                        ^
Linking CXX executable codegen
/home/robert/Documents/GitHub/eos/programs/launcher/main.cpp:405:18: error: no template named 'underlying_type_t' in namespace 'std'; did you mean
      'underlying_type'?
  using T = std::underlying_type_t <enum_type>;
        ~~~~~^~~~~~~~~~~~~~~~~
             underlying_type
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/type_traits:1855:12: note: 'underlying_type' declared here
    struct underlying_type
       ^
/home/robert/Documents/GitHub/eos/programs/launcher/main.cpp:435:17: error: no member named 'put_time' in namespace 'std'
  dstrm << std::put_time(std::localtime(&now_c), "%Y_%m_%d_%H_%M_%S");
       ~~~~~^
[ 64%] Building CXX object libraries/chain/CMakeFiles/eos_chain.dir/chain_controller.cpp.o
/home/robert/Documents/GitHub/eos/programs/launcher/main.cpp:406:39: error: no matching conversion for static_cast from 'allowed_connection' to 'T'
      (aka 'underlying_type<allowed_connection>')
  return lhs = static_cast<enum_type>(static_cast<T>(lhs) | static_cast<T>(rhs));
                                  ^~~~~~~~~~~~~~~~~~~

缺少 _t 别名看起来你在使用 C++14 时遇到了问题。错误消息中的 header 路径看起来像是您使用的是 GCC 4.8 的标准库(Ubuntu 14.04 上的默认编译器),这太旧了。

我可以看到两个解决方案:

从 GCC 的 libstdc++ 切换到 LLVM 的 libc++.[=35= 的 up-to-date 版本] 我对Ubuntu 还不够熟悉,无法告诉你如何安装它。对于 EOSIO 的编译,您必须将 -stdlib=libc++ 选项传递给 Clang 以切换到不同的标准库。 EOSIO 看起来像是在使用 CMake,因此您必须在 CMake 命令行中包含 -DCMAKE_CXX_FLAGS=-stdlib=libc++

使用 Toolchain test builds PPA 安装更新的 GCC 和 libstdc++ 除了系统默认的。对于 Ubuntu 14.04 GCC 7.2.0 是可用的最新版本,它完全支持 C++14。将 PPA 添加到您的包源中,然后执行以下操作:

sudo apt-get install gcc-7 g++-7

这将安装 GCC C 编译器和 C++ 编译器以及标准库。你的默认编译器仍然是旧的 GCC 4.8,所以你必须告诉 CMake 更新的版本:

-DCMAKE_CXX_COMPILER=g++-7 -DCMAKE_C_COMPILER=gcc-7

请注意,现在您使用 GCC(和新的标准库)而不是 Clang 编译 EOSIO。指示 Clang 使用特定版本的 libstdc++ 应该是可以的,但我不知道如何实现。

官方支持 Ubuntu 16.10。考虑升级。 (编辑:我误说 14.10) 资料来源:https://github.com/EOSIO/eos/wiki/Local-Environment#211-ubuntu-1610