Thrift C++ 链接器错误(Boost 智能指针)

Posted

技术标签:

【中文标题】Thrift C++ 链接器错误(Boost 智能指针)【英文标题】:Thrift C++ Linker Error (Boost smart pointers) 【发布时间】:2018-08-19 14:43:30 【问题描述】:

我正在按照简单的 Thrift 教程制作一个简单的部署服务器(可在此处找到:https://wiki.apache.org/thrift/ThriftUsageC%2B%2B/)。

但是,尽管完全复制了骨架并使用教程进行链接,但我遇到了以下链接器错误,即使在使用 -lthrift-L/usr/local/lib 正确链接到 Thrift 之后:

gen-cpp/server.o: In function `main':
/home/will/Documents/Research_2018/Thrift-javascript-to-CPP/server.cpp:56: 
undefined reference to `apache::thrift::server::TSimpleServer::TSimpleServer
(boost::shared_ptr<apache::thrift::TProcessor> const&, 
boost::shared_ptr<apache::thrift::transport::TServerTransport> const&, 
boost::shared_ptr<apache::thrift::transport::TTransportFactory> const&, 
boost::shared_ptr<apache::thrift::protocol::TProtocolFactory> const&)'
collect2: error: ld returned 1 exit status

我已经从最新的 tarball(版本 0.11.0)下载并编译了 Thrift。在比较了我的 server.o 文件的目标文件的符号表和 /usr/local/lib 中 Thrift 的库文件之后,看起来好像使用 std::smart_pointer 而不是 boost::smart_pointer 编译的 Thrift 库,即使在我添加之后

AC_DEFINE([FORCE_BOOST_FUNCTIONAL], [], [Forces boost usage])
AC_DEFINE([FORCE_BOOST_SMART_PTR], [], [Forces boost usage of smart ptrs])

到 Thrift 库的 configure.ac 文件。我的编译器没有内置的 C++11 支持,但它支持带有 std=c++11 标志的功能。如何解决此链接器错误?

(检查了C++ linker error in Apache Thrift tutorial - undefined symbols 和C++ linker error after change in thrift file 的问题,但没有成功)。

【问题讨论】:

【参考方案1】:

这个错误的根源是通过std=c++11标志编译我的支持C++11的Thrift库引起了某种混乱。我解决这个问题的方法是删除:

AX_CXX_COMPILE_STDCXX_11([noext], [optional])

configure.ac 文件中的宏。这意味着该库不再使用 C++11 支持进行编译,它完全依赖于 boost::smart_pointer

【讨论】:

我知道在某一时刻,我必须重建我的 Boost 库才能添加 C++11 支持。也许您的 Boost 库未在启用该支持的情况下编译。【参考方案2】:

@Will Brackenbury

我删除了 AX_CXX_COMPILE_STDCXX_11([noext], [optional]),但遇到以下错误

未定义的引用 `apache::thrift::server::TThreadedServer::TThreadedServer(std::shared_ptr 常量&,std::shared_ptr 常量&,std::shared_ptr 常量&,std::shared_ptr 常量&,std::shared_ptr const&)'

【讨论】:

不幸的是,基于此,您似乎没有遇到与我相同的错误。您的库需要std:: 版本的共享指针。我会将这些行放回文件中,然后回顾其他潜在的错误来源。

以上是关于Thrift C++ 链接器错误(Boost 智能指针)的主要内容,如果未能解决你的问题,请参考以下文章

thrift静态库问题

Thrift第一课 源码编译

Thrift安装介绍

thrift在C++中的应用

使用 Boost 源代码的链接器错误 [关闭]

简单线程程序的链接器错误(来自 boost_chrono 的符号丢失)