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

问题描述 投票:1回答:1

我的代码以前用过很好的copmile,直到boost库用changes in asio更新。在我的代码中,我定义了一个变量:boost::shared_ptr<Face> face(boost::make_shared<ThreadsafeFace>(io_service));,可以看出,它为构造函数带来了io_serviceFaceThreadsafeFacelibrary课程,我的应用程序链接到。问题发生在我的二进制文件的链接阶段,我得到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并保证头痛。

c++ boost boost-asio linker-errors
1个回答
0
投票

“这证实了所有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 &&& )在ndnrtc_client-main.o ld:找不到架构x86_64 clang的符号:错误:链接器命令失败,退出代码为1(使用-v查看调用)

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

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

通常情况下,如果名称空间发生变化,或者你(ab)使用编译器定义来改变代码的含义,你会发生这种情况(你是否可能会遇到像#define io_context io_service这样的问题?因为这是令人头疼的问题)。

注意在编译代码时使用不同的编译器版本/标志与编译库时会出现链接器错误。

有关更多疑难解答提示,请参阅:What is an undefined reference/unresolved external symbol error and how do I fix it?

© www.soinside.com 2019 - 2024. All rights reserved.