我正在遵循简单的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
而不是{{1}编译的},即使我添加了
boost::smart_pointer
到Thrift库的configure.ac文件。我的编译器没有内置的C ++ 11支持,但支持带有AC_DEFINE([FORCE_BOOST_FUNCTIONAL], [], [Forces boost usage])
AC_DEFINE([FORCE_BOOST_SMART_PTR], [], [Forces boost usage of smart ptrs])
标志的功能。如何解决此链接器错误?
(检查了C++ linker error in Apache Thrift tutorial - undefined symbols和C++ linker error after change in thrift file上的问题,但没有成功。)
答案 0 :(得分:0)
此错误的根源是通过std=c++11
标志使用C ++ 11支持编译我的Thrift库会引起某种混乱。我解决此问题的方法是删除:
AX_CXX_COMPILE_STDCXX_11([noext], [optional])
configure.ac文件中的宏。这意味着该库不再使用C ++ 11支持进行编译,并且完全依靠boost::smart_pointer
。
答案 1 :(得分:0)
@Will Brackenbury
我删除了AX_CXX_COMPILE_STDCXX_11([下一步],[可选]),但是遇到以下错误
未定义的参考 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&)'