【发布时间】:2019-02-21 21:57:41
【问题描述】:
我的代码以前可以很好地运行,直到 boost 库更新为 changes in asio。
在我的代码中,我定义了一个变量:boost::shared_ptr<Face> face(boost::make_shared<ThreadsafeFace>(io_service));,可以看出,它采用io_service 作为构造函数。 Face 和 ThreadsafeFace 是 library 类,我的应用程序链接到。
问题发生在我的二进制文件的链接阶段,我得到undefined symbols 错误:
Undefined symbols for architecture x86_64:
"ndn::ThreadsafeFace::ThreadsafeFace(boost::asio::io_context&)", referenced from:
boost::detail::sp_if_not_array<ndn::ThreadsafeFace>::type boost::make_shared<ndn::ThreadsafeFace, boost::asio::io_context&>(boost::asio::io_context&&&) in ndnrtc_client-main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
可以看出,链接器找不到ThreadsafeFace 的构造函数,它采用boost::asio::io_context& 参数。它不会——因为库不提供。唯一提供的库是带有io_service 参数。
现在,我不太明白,这个构造函数定义来自哪里,因为我的代码和库的代码都没有这个定义。
这让我觉得有了新的提升(我正在使用自制软件,macOS 链接到 1.67),io_service 会自动替换为io_context(在预处理期间?),从而导致问题。
我在编译我的代码时尝试提供-DBOOST_ASIO_ENABLE_OLD_SERVICES,但它也没有帮助。
我应该降级 boost 版本直到库更新吗?
更新
我已经运行 clang 进行预处理 (clang++ -E ...) 并在输出中找到了这个:
# 21 "/usr/local/include/boost/asio/io_service.hpp" 2 3
namespace boost {
namespace asio {
typedef io_context io_service;
}
}
所有io_service 变量实际上都是io_context 的confirms 并保证令人头疼。
【问题讨论】:
标签: c++ boost boost-asio linker-errors