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

时间:2014-05-26 16:06:10

标签: c++ linker thrift undefined-symbol

我正在浏览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

任何帮助将不胜感激。我无法弄清楚为什么它找不到TSocket实现,即使链接器调用中包含libthrift

1 个答案:

答案 0 :(得分:2)

我在OSX小牛队遇到了类似的事情(我相信),这已经有一段时间了。既然你正在使用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,但这些都受编译器/版本的限制。