我正在尝试在Raspberry pi 3和4上安装Iroha。我正在手动构建它,如下所示:
1)git clone -b master https://github.com/hyperledger/iroha
cd iroha
mkdir构建;光盘构建; cmake ..;使-j $(nproc)
然后出现以下错误
cmake / dependencies上的CMake错误。cmake:24(find_package): 找不到“ spdlog”提供的程序包配置文件(已请求 版本1.3.1)具有以下任何名称:
spdlogConfig.cmake spdlog-config.cmake
将“ spdlog”的安装前缀添加到CMAKE_PREFIX_PATH或进行设置 “ spdlog_DIR”到包含上述文件之一的目录。如果是“ spdlog” 提供单独的开发包或SDK,请确保已 已安装。 呼叫堆栈(最近的呼叫优先): CMakeLists.txt:179(包括)
–配置不完整,发生错误! 另请参见“ /home/pi/Desktop/iroha/build/CMakeFiles/CMakeOutput.log”。 另请参阅“ /home/pi/Desktop/iroha/build/CMakeFiles/CMakeError.log”
有什么办法解决这个问题吗?
答案 0 :(得分:1)
我已经在Ubuntu Server 20.04.1 LTS(GNU / Linux 5.4.0-1015-raspi aarch64)的RPI 4上构建了iroha(版本1.1.3)
首先,我们需要更新我们的系统:
sudo apt-get update
sudo apt-get upgrade -y
然后,我们应根据instruction安装依赖项:
sudo apt-get -y --no-install-recommends install build-essential git ca-certificates tar curl unzip cmake vim ninja-build -y
现在,我建议重新启动系统:
sudo reboot now
下一步是下载iroha源码,我已经在Iroha 1.1.3上对其进行了测试,因此我的源码是:
git clone --branch 1.1.3 https://github.com/hyperledger/iroha.git --depth=1
根据instruction的下一步是致电:
iroha/vcpkg/build_iroha_deps.sh
但是当我在2020年10月使用脚本进行构建时,必须采取一些额外的步骤,原因是:
一段时间后构建它可能不会遇到任何这些问题,但是也可能会遇到其他问题。
因此,建立RPI的第一步是只运行命令:
iroha/vcpkg/build_iroha_deps.sh
并等待。如果您没有发现任何问题,则不需要说明。
如果您发现cmake
与vcpkg
连接时出现问题,则表明vcpkg仍然不支持aarch64,但是有hack使用系统的cmake,而不是由vcpkg下载。为此,我们需要在命令-useSystemBinaries
之后将iroha/vcpkg/build_iroha_deps.sh
添加到文件bootstrap-vcpkg.sh
中。可以使用以下命令快速完成:
sed -i 's/\(^.*bootstrap.*$\)/\1 -useSystemBinaries/g' iroha/vcpkg/build_iroha_deps.sh
然后您可以继续构建:
./vcpkg/vcpkg install $(cat iroha/vcpkg/VCPKG_DEPS_LIST | cut -d':' -f1 | tr '\n' ' ')
./vcpkg/vcpkg install --head $(cat iroha/vcpkg/VCPKG_HEAD_DEPS_LIST | cut -d':' -f1 | tr '\n' ' ')
如果您遇到与标记boost-container
连接的建筑物-m64
的问题(在RPI的gcc上不存在),则需要创建包装程序以删除该标志。我已经在c ++中创建了包装器(文件g++wrapper.cc
):
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
using namespace std;
string args2Text(int argc, char** argv, const char* forbiddenFlag="-m64", const char* compilerCommand="/usr/bin/g++");
int returnValidNumberFromSubcommand(int systemCallReturnValue);
string escapeQuotes(const string& text);
int main(int argc, char* argv[])
{
const auto command = args2Text(argc, argv);
const auto status = system(command.c_str());
return returnValidNumberFromSubcommand(status);
}
string args2Text(int argc, char** argv, const char* forbiddenFlag, const char* compilerCommand)
{
string command = compilerCommand;
for (int i = 1; i < argc; ++i)
{
if (strcmp(argv[i], forbiddenFlag))
command += " "s + escapeQuotes(argv[i]);
}
return command;
}
string escapeQuotes(const string& text)
{
constexpr const char* escapedQuote = R"_(\")_";
string returnString;
returnString.reserve(text.size() + 2);
for (auto c : text)
{
if ('"' == c)
returnString += escapedQuote;
else
returnString += c;
}
return returnString;
}
int returnValidNumberFromSubcommand(int systemCallReturnValue)
{
if (systemCallReturnValue < 0)
{
return -1;
}
else
{
if (WIFEXITED(systemCallReturnValue))
{
return WEXITSTATUS(systemCallReturnValue);
}
else
{
return 1;
}
}
}
只需编译:{{1}}
我们只需要用包装器替换系统的g++ g++wrapper.cc -o g++wrapper
,我们可以使用以下命令来完成此操作:
/usr/bin/c++
现在我们可以像上面那样继续构建。
当我们遇到构建GRPC的问题时:
sudo mv /usr/bin/c++ /usr/bin/c++_original
sudo mv g++wrapper /usr/bin/c++
并检入日志文件:
-- Using source at /home/ubuntu/vcpkg/buildtrees/grpc/src/577f0c79b1-086c8c6e6c
-- Configuring x64-linux-dbg
-- Configuring x64-linux-rel
-- Building x64-linux-dbg
CMake Error at scripts/cmake/vcpkg_execute_build_process.cmake:134 (message):
Command failed: /usr/bin/cmake;--build;.;--config;Debug;--target;install;--;-v
Working Directory: /home/ubuntu/vcpkg/buildtrees/grpc/x64-linux-dbg
See logs for more information:
/home/ubuntu/vcpkg/buildtrees/grpc/install-x64-linux-dbg-out.log
然后,我通过注释/home/ubuntu/vcpkg/buildtrees/grpc/install-x64-linux-dbg-out.log
/home/ubuntu/vcpkg/buildtrees/grpc/src/577f0c79b1-086c8c6e6c/src/core/lib/iomgr/ev_epollex_linux.cc:1105:13: error: ambiguating new declaration of ‘long int gettid()’
函数重定义进行了修复:
gettid
然后我在函数sed -i 's_\(^.*long gettid(.*$\)_//\1_g' $(find . -name ev_epollex_linux.cc)
的另一个定义中遇到了类似的问题,所以我做了类似的事情:
gettid
更正后,我们可以恢复构建。
如果一切正常,我们用二进制文件包装c ++命令,我们应该恢复原始命令:
sed -i 's_\(^.*long gettid(.*$\)_//\1_g' $(find . -name log_linux.cc)
然后,我们应该能够编译对iroha的依赖关系。现在根据说明2,我们应该找出我们需要的cmake标志,我们可以使用以下命令来完成此操作:
sudo mv /usr/bin/c++_original /usr/bin/c++
在我的情况下它被打印了:
vcpkg/vcpkg integrate install
现在我们可以在cmake的命令中使用它了。
-DCMAKE_TOOLCHAIN_FILE=/home/ubuntu/vcpkg/scripts/buildsystems/vcpkg.cmake
然后调用makefile(我建议在RPI上使用单线程):
cd iroha
cmake -H. -Bbuild -DTESTING=OFF \
-DVCPKG_TARGET_TRIPLET=x64-linux \
-DCMAKE_TOOLCHAIN_FILE=/home/ubuntu/vcpkg/scripts/buildsystems/vcpkg.cmake
如果成功非常好!但是您看到问题了吗?
cd build
make
sudo make install
您需要在文件中注释该行:
CMake Error at cmake_install.cmake:78 (file):
file INSTALL cannot find "/home/ubuntu/iroha/-lpthread": No such file or directory
然后我们可以重新运行:
sed -i 's_\(^.*\-lpthread.*\)$_#\1_g' cmake_install.cmake
这就是在Raspberry Pi 4上构建Iroha的全部内容,现在您可以安装(或使用docker映像)数据库并享用。