我正在按照简单的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的库文件后,看起来好像Thrift库使用std::smart_pointer
而不是boost::smart_pointer
编译,即使我添加了
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的问题没有成功)。
这个错误的根源是通过std=c++11
标志编译我的Thrift库与C ++ 11支持引起了某种混乱。我解决这个问题的方法是删除:
AX_CXX_COMPILE_STDCXX_11([noext], [optional])
configure.ac文件中的宏。这意味着库不再使用C ++ 11支持编译,它完全依赖于boost::smart_pointer
。
@Will Brackenbury
我删除了AX_CXX_COMPILE_STDCXX_11([noext],[可选]),但遇到以下错误
未定义引用`apache :: thrift :: server :: TThreadedServer :: TThreadedServer(std :: shared_ptr const&,std :: shared_ptr const&,std :: shared_ptr const&,std :: shared_ptr const&,std :: shared_ptr const&)'