C++ linker error in Apache Thrift tutorial - undefined symbols

▼魔方 西西 提交于 2020-02-15 18:02:04

问题


I am running through Apache's Thrift tutorial: http://wiki.apache.org/thrift/ThriftUsageC%2B%2B My Thrift is version 0.9.1, and I'm on OS X. I've performed a search for similar problems with this tutorial, and while other people have also had issues they don't appear to be similar to the one I'm having.

The server both compiles and links properly, and the client compiles correctly as well. The problem is linking the client at the very last step of the tutorial, where I get this:

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)

I have received this same error through the sample Makefile in that tutorial as well as following the command line build procedure throughout the tutorial. My client code is a

I am running on OS X, so I have added -stdlib=libstdc++ to each line in the command line procedure. Here's a Bash example of exactly what I'm using to compile/link (my initial Thrift file was 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

Any help would be appreciated. I can't figure out why it can't find the TSocket implementation even though libthrift is included in the linker invocation.


回答1:


I ran into something similar on OSX Mavericks (I believe), this was a while back. Since you're using clang as well I take it you might be on OSX too?

Anyways, what I ended up doing was compiling on the C++11 standard and using for the stdlib libc++ as opposed to libstdc++. Current versions of clang deal well with both.

So your compile lines would probably end up looking something like this:

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

I also vaguely recall I had to resort to c++0x on linux and gcc, but these are subject to compiler/version.



来源:https://stackoverflow.com/questions/23874016/c-linker-error-in-apache-thrift-tutorial-undefined-symbols

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!