【问题标题】:Error while compiling Thrift Server编译 Thrift 服务器时出错
【发布时间】:2012-01-14 04:57:31
【问题描述】:

我是 Thrift 的新手:http://thrift.apache.org/ 我正在使用 CentOS,并且“也许”成功安装了 Thrift。我可以使用 Thrift 来生成代码。 但请遵循说明:http://wiki.apache.org/thrift/ThriftUsageC%2B%2B 编译 Something_server.cpp 时出现错误 有人知道请帮我找出原因。我不知道。非常感谢

我用thrift让PHP调用C++来做只有C++才能做的工作。 有人对我有其他建议吗?谢谢

[root@localhost gen-cpp]# g++ -Wall -I/usr/local/include/thrift *.cpp -lthrift -o something /usr/local/include/thrift/protocol/TBinaryProtocol.tcc:在成员函数âuint32_t apache::thrift::protocol::TBinaryProtocolT::writeI16(int16_t)â中: /usr/local/include/thrift/protocol/TBinaryProtocol.tcc:147:错误:“htons”没有依赖于模板参数的参数,因此“htons”的声明必须可用 /usr/local/include/thrift/protocol/TBinaryProtocol.tcc:147:错误:(如果您使用“-fpermissive”,G++ 将接受您的代码,但不允许使用未声明的名称) /usr/local/include/thrift/protocol/TBinaryProtocol.tcc:在成员函数âuint32_t apache::thrift::protocol::TBinaryProtocolT::writeI32(int32_t)â中: /usr/local/include/thrift/protocol/TBinaryProtocol.tcc:154:错误:“htonl”没有依赖于模板参数的参数,因此“htonl”的声明必须可用 Something_server.cpp:在成员函数“virtual int32_t SomethingHandler::ping()”中: Something_server.cpp:28:警告:函数中没有返回语句返回非 void /usr/local/include/thrift/protocol/TBinaryProtocol.tcc:在成员函数âuint32_t apache::thrift::protocol::TBinaryProtocolT::writeI16(int16_t) [with Transport_ = apache::thrift::transport::TTransport] A: /usr/local/include/thrift/protocol/TVirtualProtocol.h:401:从âuint32_t apache::thrift::protocol::TVirtualProtocol::writeI16_virt(int16_t) [with Protocol_ = apache::thrift::protocol::TBinaryProtocolT , Super_ = apache::thrift::protocol::TProtocolDefaults]â Something_server.cpp:42:从这里实例化 /usr/local/include/thrift/protocol/TBinaryProtocol.tcc:147:错误:“htons”未在此范围内声明 /usr/local/include/thrift/protocol/TBinaryProtocol.tcc:在成员函数âuint32_t apache::thrift::protocol::TBinaryProtocolT::writeI32(int32_t) [with Transport_ = apache::thrift::transport::TTransport] A: /usr/local/include/thrift/protocol/TVirtualProtocol.h:405:从âuint32_t apache::thrift::protocol::TVirtualProtocol::writeI32_virt(int32_t) [with Protocol_ = apache::thrift::protocol::TBinaryProtocolT , Super_ = apache::thrift::protocol::TProtocolDefaults]â Something_server.cpp:42:从这里实例化 /usr/local/include/thrift/protocol/TBinaryProtocol.tcc:154:错误:未在此范围内声明“htonl” /usr/local/include/thrift/protocol/TBinaryProtocol.tcc:在成员函数âuint32_t apache::thrift::protocol::TBinaryProtocolT::readI16(int16_t&) [with Transport_ = apache::thrift::transport::TTransport] A: /usr/local/include/thrift/protocol/TVirtualProtocol.h:499:从âuint32_t apache::thrift::protocol::TVirtualProtocol::readI16_virt(int16_t&) [with Protocol_ = apache::thrift::protocol::TBinaryProtocolT , Super_ = apache::thrift::protocol::TProtocolDefaults]â Something_server.cpp:42:从这里实例化 /usr/local/include/thrift/protocol/TBinaryProtocol.tcc:362:错误:ântohsâ 未在此范围内声明 /usr/local/include/thrift/protocol/TBinaryProtocol.tcc:在成员函数âuint32_t apache::thrift::protocol::TBinaryProtocolT::readI32(int32_t&) [with Transport_ = apache::thrift::transport::TTransport] A: /usr/local/include/thrift/protocol/TVirtualProtocol.h:503:从âuint32_t apache::thrift::protocol::TVirtualProtocol::readI32_virt(int32_t&) [with Protocol_ = apache::thrift::protocol::TBinaryProtocolT , Super_ = apache::thrift::protocol::TProtocolDefaults]â Something_server.cpp:42:从这里实例化 /usr/local/include/thrift/protocol/TBinaryProtocol.tcc:373:错误:未在此范围内声明ântohlâ /usr/local/include/thrift/protocol/TBinaryProtocol.tcc:在成员函数âuint32_t apache::thrift::protocol::TBinaryProtocolT::writeI16(int16_t)â中: /usr/local/include/thrift/protocol/TBinaryProtocol.tcc:147:错误:“htons”没有依赖于模板参数的参数,因此“htons”的声明必须可用 /usr/local/include/thrift/protocol/TBinaryProtocol.tcc:147:错误:(如果您使用“-fpermissive”,G++ 将接受您的代码,但不允许使用未声明的名称) /usr/local/include/thrift/protocol/TBinaryProtocol.tcc:在成员函数âuint32_t apache::thrift::protocol::TBinaryProtocolT::writeI32(int32_t)â中: /usr/local/include/thrift/protocol/TBinaryProtocol.tcc:154:错误:“htonl”没有依赖于模板参数的参数,因此“htonl”的声明必须可用 Something_server.skeleton.cpp:在成员函数“virtual int32_t SomethingHandler::ping()”中: Something_server.skeleton.cpp:28:警告:函数中没有返回语句返回非 void /usr/local/include/thrift/protocol/TBinaryProtocol.tcc:在成员函数âuint32_t apache::thrift::protocol::TBinaryProtocolT::writeI16(int16_t) [with Transport_ = apache::thrift::transport::TTransport] A: /usr/local/include/thrift/protocol/TVirtualProtocol.h:401:从âuint32_t apache::thrift::protocol::TVirtualProtocol::writeI16_virt(int16_t) [with Protocol_ = apache::thrift::protocol::TBinaryProtocolT , Super_ = apache::thrift::protocol::TProtocolDefaults]â Something_server.skeleton.cpp:42:从这里实例化 /usr/local/include/thrift/protocol/TBinaryProtocol.tcc:147:错误:“htons”未在此范围内声明 /usr/local/include/thrift/protocol/TBinaryProtocol.tcc:在成员函数âuint32_t apache::thrift::protocol::TBinaryProtocolT::writeI32(int32_t) [with Transport_ = apache::thrift::transport::TTransport] A: /usr/local/include/thrift/protocol/TVirtualProtocol.h:405:从âuint32_t apache::thrift::protocol::TVirtualProtocol::writeI32_virt(int32_t) [with Protocol_ = apache::thrift::protocol::TBinaryProtocolT , Super_ = apache::thrift::protocol::TProtocolDefaults]â Something_server.skeleton.cpp:42:从这里实例化 /usr/local/include/thrift/protocol/TBinaryProtocol.tcc:154:错误:未在此范围内声明“htonl” /usr/local/include/thrift/protocol/TBinaryProtocol.tcc:在成员函数âuint32_t apache::thrift::protocol::TBinaryProtocolT::readI16(int16_t&) [with Transport_ = apache::thrift::transport::TTransport]一:

【问题讨论】:

  • 我在同一条船上 - CentOS,Thrift 从源代码构建

标签: c++ thrift


【解决方案1】:

在我的系统(Ubuntu 10.10)上,htons() 和 htonl() 在 netinet/in.h 中声明。

我遇到了同样的错误,我在构建我的 Thrift 服务器时通过将 -DHAVE_NETINET_IN_H 添加到 g++ 命令行参数来修复它。

这将导致预处理器在 thrift/protocol/TPrototol.h 中包含 netinet/in.h,因此编译器可以看到 hton* 声明。

TProtocol.h 有以下几行在未定义 HAVE_NETINET_IN_H 时会导致编译器错误。

#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif

这可能是 Thrift 配置脚本中的一个错误,它以某种方式跳过了定义。

【讨论】:

    【解决方案2】:

    好像你有 htons() 的问题,缺少 htonl() 函数,你是否包含了正确的标题?

    #include &lt;arpa/inet.h&gt;

    【讨论】:

      【解决方案3】:

      来自Gmane,您需要一些#defines。 将-DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H 添加到您的 Makefile。

      例如。在 Makefile 中

      BOOST_DIR = /usr/include/boost
      THRIFT_DIR = /usr/local/include/thrift
      LIB_DIR = /usr/local/lib
      BOOST_LIB_DIR = /usr/lib64/boost
      THRIFT_LIB_DIR = /home/timothy.ohare/bin/lib
      
      g++ -DHAVE_INTTYPES_H -DHAVE_NETINET_IN_H -o CppServer -I${THRIFT_DIR} -I${BOOST_DIR}  -I../gen-cpp -L${LIB_DIR}  -L${BOOST_LIB_DIR}  -L${THRIFT_LIB_DIR} -lthrift CppServer.cpp ${GEN_SRC}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-28
        • 2013-09-23
        • 1970-01-01
        相关资源
        最近更新 更多