Я пытаюсь скомпилировать EOS-блокчейн / проект умного контракта на GitHub в Ubuntu 14.04:
После получения 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. Пути заголовков в сообщениях об ошибках выглядят так, как будто вы используете стандартную библиотеку из 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
Обратите внимание, что теперь вы компилируете EOSIO с GCC (и новым stdlib) вместо Clang. Поручить Clang использовать определенную версию libstdc ++ должно быть возможно, но я не знаю как.
Официальная поддержка для Ubuntu 16.10. Подумайте об обновлении.
(Отредактировано: я по ошибке сказал 14.10)
Источник: https://github.com/EOSIO/eos/wiki/Local-Environment#211-ubuntu-1610