【问题标题】:Undefined symbols for io_context: linking error for the latest boost libraryio_context 的未定义符号:最新 boost 库的链接错误
【发布时间】:2019-02-21 21:57:41
【问题描述】:

我的代码以前可以很好地运行,直到 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&amp; 参数。它不会——因为库不提供。唯一提供的库是带有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_contextconfirms 并保证令人头疼。

【问题讨论】:

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


    【解决方案1】:

    “这证实了所有 io_service 变量实际上都是 io_context 并保证令人头疼”

    事实上,这保证不会令人头疼。 Typedef 是别名:它们完全相同。所以io_service 变成了指代同一类型的另一种方式,即使在某些地方拼写碰巧不同。这实际上是您所需要的。

    阅读消息:

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

    这告诉您ndn::ThreadsafeFace确实提供了所需的构造函数,因为它是从您的代码中引用的。如果没有提供,那将是 compile 错误,而不是 link 错误。

    所以你的问题是不同的。您要么缺少链接器输入,要么您链接的库对象以/不同方式/以这样的方式编译:当您包含声明 ThreadsafeFace 的标头时,它不提供声明的构造函数的定义。

    通常,如果命名空间发生更改,或者当您(ab)使用编译器定义来更改代码的含义时(您是否可能搞砸了 #define io_context io_service 之类的东西?因为那头痛的秘诀)。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      相关资源
      最近更新 更多