我正在运行Apache的Thrift教程:http://wiki.apache.org/thrift/ThriftUsageC%2B%2B我的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以及整个教程中的命令行构建过程,我都收到了相同的错误.我的客户代码是
我在OS X上运行,因此我在命令行过程的每一行中都添加了-stdlib = libstdc.这是我用来编译/链接的Bash示例(我最初的Thrift文件是sample.thrift):
#!/bin/bash
# Server
# Writing out each .cpp to compile, as opposed to the tutorial which uses *.cpp,
# since my client code is in the same directory.
g++ -stdlib=libstdc++ -DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H -Wall -I/usr/local/include/thrift Something.cpp Something_server.cpp sample_constants.cpp sample_types.cpp -L/usr/local/lib -lthrift -o something
g++ -stdlib=libstdc++ -Wall -I/usr/local/include/thrift -c Something.cpp -o something.o
g++ -stdlib=libstdc++ -Wall -I/usr/local/include/thrift -c Something_server.cpp -o server.o
g++ -stdlib=libstdc++ -Wall -I/usr/local/include/thrift -c sample_constants.cpp -o constants.o
g++ -stdlib=libstdc++ -Wall -I/usr/local/include/thrift -c sample_types.cpp -o types.o
g++ -stdlib=libstdc++ -L/usr/local/lib *.o -o Something_server -lthrift
# Client
g++ -stdlib=libstdc++ -Wall -I/usr/local/include/thrift -c Something_client.cpp -o client.o
# THIS LINE PRODUCES THE UNDEFINED SYMBOLS ERROR - all of the above are successful
g++ -stdlib=libstdc++ -L/usr/local/lib client.o something.o constants.o types.o -o Something_client -lthrift
任何帮助,将不胜感激.我不知道为什么即使链接器调用中包含libthrift也找不到TSocket实现.
解决方法:
我在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,但是这些都取决于编译器/版本.