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 智能指针)的主要内容,如果未能解决你的问题,请参考以下文章