Thrift 生成的代码未定义参考

Posted

技术标签:

【中文标题】Thrift 生成的代码未定义参考【英文标题】:Thrift generated code undefined reference 【发布时间】:2017-09-08 08:39:17 【问题描述】:

我正在尝试编写一些代码来处理 Thrift 生成的代码,但我得到的只是生成代码的错误。我正在使用 Thrift 0.10.0 和 g++ 5.4.1。

错误:

server/libserver.a(TalkService.cpp.o): In function `std::less<lineserver::Contact>::operator()(lineserver::Contact const&, lineserver::Contact const&) const':
TalkService.cpp:(.text._ZNKSt4lessIN10lineserver7ContactEEclERKS1_S4_[_ZNKSt4lessIN10lineserver7ContactEEclERKS1_S4_]+0x23): undefined reference to `lineserver::Contact::operator<(lineserver::Contact const&) const'
collect2: error: ld returned 1 exit status
CMakeFiles/testshit.dir/build.make:99: recipe for target 'testshit' failed
make[2]: *** [testshit] Error 1
CMakeFiles/Makefile2:68: recipe for target 'CMakeFiles/testshit.dir/all' failed
make[1]: *** [CMakeFiles/testshit.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

目录树:

├── app
│   └── main.cpp
├── CMakeLists.txt
└── server
    ├── CMakeLists.txt
    ├── line_constants.cpp
    ├── line_constants.h
    ├── line_types.cpp
    ├── line_types.h
    ├── TalkService.cpp
    └── TalkService.h

app/main.cpp:

#include <iostream>
#include <thrift/transport/THttpClient.h>
#include <thrift/protocol/TBinaryProtocol.h>
#include <thrift/transport/TTransportUtils.h>
#include <boost/algorithm/string.hpp>
#include "../server/TalkService.h"

using namespace std;
using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;
using namespace lineserver;

int main()

    boost::shared_ptr<TTransport> socket(new THttpClient("https://gd2.line.naver.jp", 443, "/api/v3/TalkService.do"));
    boost::shared_ptr<TTransport> transport(new TBufferedTransport(socket));
    boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));
    TalkServiceClient client(protocol);

    return 0;

CMakeLists.txt:

cmake_minimum_required(VERSION 3.8)
project(testshit)

set(CMAKE_CXX_STANDARD 11)

find_library(THRIFT thrift)

include_directories(server app)
link_directories(server app)

add_subdirectory(server)

set(SOURCE_FILES app/main.cpp)

add_executable(testshit $SOURCE_FILES)
target_link_libraries(testshit $THRIFT server)

服务器/CMakeLists.txt:

find_library(THRIFT thrift)

file(GLOB SRC_FILES line_constants.cpp line_types.cpp TalkService.cpp)
add_library(server $SRC_FILES)

target_link_libraries(server $THRIFT)

用于生成的 Thrift 文件: line.thrift

我真的很想得到一些帮助,因为我已经尝试找出解决方案很长一段时间了。

【问题讨论】:

【参考方案1】:

您可能对创建套接字/传输有一些困惑(似乎您正在创建一个 TTransport 类型的套接字)。

您应该尝试在客户端创建如下通信堆栈:

boost::shared_ptr<TSocket> socket(new TSocket("host", "port"));

boost::shared_ptr<TTransport> transport = boost::shared_ptr<TTransport>(new THttpClient("https://gd2.line.naver.jp", 443, "/api/v3/TalkService.do"));

boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));

TalkServiceClient client(protocol);

根据您的情况设置“主机”和“端口”值。 按照这种创建模式,我成功地使用了 thrift。

【讨论】:

我进行了更改,但我认为该错误不是由 main.cpp 引起的,因为即使进行了更改,它仍然是一样的 您能提供 thrift 生成的输出文件吗?您的 Contact 类/结构似乎缺少(可能)STL 容器所需的 operator

以上是关于Thrift 生成的代码未定义参考的主要内容,如果未能解决你的问题,请参考以下文章

Schema 未完全从 Thrift 协议转换为 CQL 协议

Python 错误:在 SWIG 生成的 C++ 模板代码模块中未定义构造函数

未定义的行为是否真的有助于现代编译器优化生成的代码?

MVC 代码优先 - 数据库未生成

未捕获的 ReferenceError:“$ 未定义”[重复]

Thrift 代码分析