编译magi钱包时出现makefile.unix:188 obj/magirpc.o Error 1错误如何解决
问题
我在编译magi钱包时遇到了如下报错,在主流搜索引擎搜索均未找到解决方案,仅在项目的makefile中见过相关提及。对应项目仓库已近3年未更新,提交的issue无人回复,现寻求解决方案。
报错信息
magirpc.cpp: At global scope: magirpc.cpp:668:102: error: wrong number of template arguments (2, should be 1) static void RPCAcceptHandler(boost::shared_ptr< basic_socket_acceptor<Protocol, SocketAcceptorService> > acceptor, magirpc.cpp:668:104: error: template argument 1 is invalid static void RPCAcceptHandler(boost::shared_ptr< basic_socket_acceptor<Protocol, SocketAcceptorService> > acceptor, magirpc.cpp:678:95: error: wrong number of template arguments (2, should be 1) static void RPCListen(boost::shared_ptr< basic_socket_acceptor<Protocol, SocketAcceptorService> > acceptor, magirpc.cpp:678:97: error: template argument 1 is invalid static void RPCListen(boost::shared_ptr< basic_socket_acceptor<Protocol, SocketAcceptorService> > acceptor, magirpc.cpp:683:91: error: base operand of ‘->’ is not a pointer AcceptedConnectionImpl<Protocol>* conn = new AcceptedConnectionImpl<Protocol>(acceptor->get_io_service(), context, fUseSSL); magirpc.cpp:685:13: error: base operand of ‘->’ is not a pointer acceptor->async_accept( magirpc.cpp:700:102: error: wrong number of template arguments (2, should be 1) static void RPCAcceptHandler(boost::shared_ptr< basic_socket_acceptor<Protocol, SocketAcceptorService> > acceptor, magirpc.cpp:700:104: error: template argument 1 is invalid static void RPCAcceptHandler(boost::shared_ptr< basic_socket_acceptor<Protocol, SocketAcceptorService> > acceptor, magirpc.cpp:710:17: error: base operand of ‘->’ is not a pointer && acceptor->is_open()) magirpc.cpp:711:45: error: no matching function for call to ‘RPCListen(int&, boost::asio::ssl::context&, const bool&)’ RPCListen(acceptor, context, fUseSSL); magirpc.cpp:775:58: error: no matching function for call to ‘boost::asio::ssl::context::context(boost::asio::io_service&, boost::asio::ssl::context_base::method)’ ssl::context context(io_service, ssl::context::sslv23); magirpc.cpp:791:41: error: ‘class boost::asio::ssl::context’ has no member named ‘impl’ SSL_CTX_set_cipher_list(context.impl(), strCiphers.c_str()); magirpc.cpp:816:45: error: no matching function for call to ‘RPCListen(boost::shared_ptr<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> >&, boost::asio::ssl::context&, const bool&)’ RPCListen(acceptor, context, fUseSSL); magirpc.cpp:842:49: error: no matching function for call to ‘RPCListen(boost::shared_ptr<boost::asio::basic_socket_acceptor<boost::asio::ip::tcp> >&, boost::asio::ssl::context&, const bool&)’ RPCListen(acceptor, context, fUseSSL); magirpc.cpp:1085:58: error: no matching function for call to ‘boost::asio::ssl::context::context(boost::asio::io_service&, boost::asio::ssl::context_base::method)’ ssl::context context(io_service, ssl::context::sslv23); make: *** [makefile.unix:188: obj/magirpc.o] Error 1
注:完整构建日志可搜索pastebin编号XG59GS1E查看。
解决方案
根因说明
上述报错全部由Boost版本不兼容导致:magi钱包代码适配的是Boost 1.55~1.59版本的Asio API,你当前系统安装的Boost版本过新,新版本Boost对Asio的模板参数定义、SSL上下文构造、内部成员访问接口都做了不兼容修改。
解决方法
方案1:降级Boost版本(兼容性最好,无需修改代码)
- 卸载当前系统自带的Boost库,下载Boost 1.58版本源码手动编译安装,建议安装到独立目录(比如
/opt/boost1.58)避免覆盖系统库 - 打开项目
src目录下的makefile.unix,修改Boost头文件和库路径指向你安装的旧版本Boost路径:
BOOST_INCLUDE_PATH=/opt/boost1.58/include BOOST_LIB_PATH=/opt/boost1.58/lib
- 重新执行编译命令即可完成构建
方案2:适配新版Boost(无需降级系统库,需修改少量代码)
编辑src/magirpc.cpp,做三处修改:
- 替换所有
basic_socket_acceptor<Protocol, SocketAcceptorService>为basic_socket_acceptor<Protocol>:新版Asio移除了basic_socket_acceptor的第二个模板参数 - 替换所有
ssl::context context(io_service, ssl::context::sslv23);为ssl::context context(ssl::context::sslv23);:新版ssl::context构造函数不再需要传入io_service参数 - 替换所有
context.impl()为context.native_handle():新版ssl::context的底层句柄获取接口从impl()改为了native_handle()
修改完成后重新执行编译即可。
内容的提问来源于stack exchange,提问作者swanserquack
相关产品推荐
相关产品推荐

