C++ C++;Apache Thrift教程中的链接器错误-未定义符号

C++ C++;Apache Thrift教程中的链接器错误-未定义符号,c++,linker,thrift,undefined-symbol,C++,Linker,Thrift,Undefined Symbol,我正在浏览Apache的Thrift教程:我的Thrift版本是0.9.1,我使用的是OS X。我在本教程中搜索了类似的问题,虽然其他人也有问题,但他们似乎与我遇到的问题并不相似 服务器可以正确编译和链接,客户端也可以正确编译。问题是在本教程的最后一步链接客户机,我从中得到以下信息: Undefined symbols for architecture x86_64: "apache::thrift::transport::TSocket::TSocket(std::string, int)

我正在浏览Apache的Thrift教程:我的Thrift版本是0.9.1,我使用的是OS X。我在本教程中搜索了类似的问题,虽然其他人也有问题,但他们似乎与我遇到的问题并不相似

服务器可以正确编译和链接,客户端也可以正确编译。问题是在本教程的最后一步链接客户机,我从中得到以下信息:

Undefined symbols for architecture x86_64:
  "apache::thrift::transport::TSocket::TSocket(std::string, int)", referenced from:
      _main in Something_client-e25162.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我在该教程中通过示例Makefile以及在整个教程中遵循命令行构建过程收到了相同的错误。我的客户代码是

我在OSX上运行,所以我在命令行过程中的每一行都添加了
-stdlib=libstdc++
。下面是一个Bash示例,它确切地说明了我正在使用什么来编译/链接(我最初的Thrift文件是sample.Thrift):


任何帮助都将不胜感激。我不明白为什么它找不到
TSocket
实现,即使链接器调用中包含了
libthrift

我在OSX Mavericks上遇到了类似的东西(我相信),这是很久以前的事了。既然你也在使用clang,我想你也可能在OSX上吧

无论如何,我最终做的是在C++11标准上编译,并用于stdlib
libc++
,而不是
libstdc++
。当前版本的clang可以很好地处理这两个问题

因此,您的编译行可能会最终看起来像这样:

g++ -std=c++11 -stdlib=libc++ -DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H -Wall -I/usr/local/include/thrift Foo.cpp Foo_server.cpp foo_constants.cpp foo_types.cpp -L/usr/local/lib -lthrift -o foo
我还隐约记得,在linux和gcc上,我不得不求助于c++0x,但这些都取决于编译器/版本

g++ -std=c++11 -stdlib=libc++ -DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H -Wall -I/usr/local/include/thrift Foo.cpp Foo_server.cpp foo_constants.cpp foo_types.cpp -L/usr/local/lib -lthrift -o foo