ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-10-11 20:06:59  阅读:335  来源: 互联网

标签: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

任何帮助,将不胜感激.我不知道为什么即使链接器调用中包含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,但是这些都取决于编译器/版本.

标签:c,linker,thrift,undefined-symbol
来源: https://codeday.me/bug/20191011/1895015.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有