3

我正在尝试在 Ubuntu 14.04 的 GitHub 上编译 EOS 区块链/智能合约项目:

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));
                                  ^~~~~~~~~~~~~~~~~~~
4

2 回答 2

4

Missing _talias names 看起来您在使用 C++14 时遇到问题。错误消息中的标头路径看起来像是您使用的是 GCC 4.8(Ubuntu 14.04 上的默认编译器)中的标准库,这实在是太旧了。

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

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

使用工具链测试构建 PPA来安装较新的 GCC 和 libstdc++,以及系统默认的。对于 Ubuntu 14.04,GCC 7.2.0 是可用的最新版本,完全支持 C++14。将 PPA 添加到您的包源中,然后执行以下操作:

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

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

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

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

于 2017-12-26T14:10:26.007 回答
1

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

于 2018-01-01T15:09:58.387 回答