io_context的未定义符号:最新boost库的链接错误

时间:2018-09-17 23:14:23

标签: c++ boost boost-asio linker-errors

我的代码以前曾经很不错,直到boost库用changes in asio更新。 在我的代码中,我定义了一个变量:boost::shared_ptr<Face> face(boost::make_shared<ThreadsafeFace>(io_service));,可以看出,该变量以io_service作为构造函数。 FaceThreadsafeFacelibrary类,我的应用程序链接到该类。 问题发生在我的二进制文件的链接阶段,在那里我得到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;


}
}

confirms的所有io_service变量实际上都是io_context,并保证令人头疼。

1 个答案:

答案 0 :(得分:0)

  

“这将确认所有io_service变量实际上都是io_context并保证令人头痛”

事实上,这保证没有头痛。 Typedef是别名:它们完全相同。因此,io_service成为引用相同类型的另一种方式,即使某些地方的拼写恰好不同。这实际上就是您所需要的。

阅读消息:

  

体系结构x86_64的未定义符号:     “ ndn :: ThreadsafeFace :: ThreadsafeFace(boost :: asio :: io_context&)”,引用自:         在ndnrtc_client-main.o中的boost :: detail :: sp_if_not_array :: type boost :: make_shared(boost :: asio :: io_context &&&&)   ld:找不到架构x86_64的符号   clang:错误:链接器命令失败,退出代码为1(使用-v查看调用)

这告诉您ndn::ThreadsafeFace 确实 提供了必需的构造函数,因为它是从您的代码中引用的。如果未提供,则将是编译错误,而不是链接错误。

所以您的问题有所不同。您要么缺少链接器输入,要么/不同地/编译了要链接的库对象,使得它不提供包含声明ThreadsafeFace的标头时所声明的构造函数的定义。

通常,如果命名空间发生更改,或者当您(滥用)的编译器定义更改代码的含义时,就会发生这种情况(您可能是在弄乱#define io_context io_service之类的东西吗?因为头痛的食谱)。

当您在编译代码和编译库时使用不同的编译器版本/标志时,甚至可能导致注释链接器错误。

有关更多故障排除提示,请参见:What is an undefined reference/unresolved external symbol error and how do I fix it?