Ошибка при компиляции Thrift Server - PullRequest
4 голосов
/ 06 декабря 2011

Я новичок в Thrift: http://thrift.apache.org/ Я использую CentOS, и "возможно" успешно установил 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 что-то / 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: error: (если вы используете â-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) [с Transport_ = apache :: thrift :: transport :: TTransport] â: /usr/local/include/thrift/protocol/TVirtualProtocol.h:401: создается из apint :: thrift :: protocol :: TVirtualProtocol :: writeI16_virt (int16_t) [с протоколом = 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: Inфункция-член uint32_t apache :: thrift :: protocol :: TBinaryProtocolT :: writeI32 (int32_t) [с Transport_ = apache :: thrift :: transport :: TTransport] â:/usr/local/include/thrift/protocol/TVirtualProtocol.h:405: создается из apache :: thrift :: protocol :: TVirtualProtocol :: writeI32_virt (int32_t) [с 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 &) [с Transport_ = apache :: thrift :: transport :: TTransport]: /usr/local/include/thrift/protocol/TVirtualProtocol.h:499: создается из apache :: thrift :: protocol :: TVirtualProtocol :: readI16_virt (int16_t &) [с 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] â: / usr / local / include / thrift / protocol/TVirtualProtocol.h:503: создается из apache :: thrift :: protocol :: TVirtualProtocol :: readI32_virt (int32_t &) [с помощью Protocol_ = apache :: thrift :: protocol :: TBinaryProtocolT, Super_ = apache :: thrift :: protocol:: TProtocolDefaults] â € Something_server.cpp: 42: создается здесь /usr/local/include/thrift/protocol/TBinaryProtocol.tcc:373: ошибка: в этой области действия / usr / local / include / thrift / protocol не было объявлено ântohlâ/TBinaryProtocol.tcc: В функции-члене apint :: thrift :: protocol :: протокол :: TBinaryProtocolT :: writeI16 (int16_t) â: /usr/local/include/thrift/protocol/TBinaryProtocol.tcc:147: ошибка: нет аргументовtonshtonsâ, которые зависят от параметра шаблона, поэтому объявление tonshtonsâ должно быть доступно /usr/local/include/thrift/protocol/TBinaryProtocol.tcc:147: error: (если вы используете â-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: error: нет никаких аргументов для âhtonlâ, которые зависят от параметра шаблонапоэтому должно быть доступно объявление âhtonlâ €. Something_server.skeleton.cpp: в функции-члене virtual int32_t SomethingHandler :: ping () â: Something_server.skeleton.cpp: 28: предупреждение: в функции, возвращающей non-void / usr /, нет оператора returnlocal / include / thrift / protocol / TBinaryProtocol.tcc: в функции-член âuint32_t apache :: thrift :: protocol :: TBinaryProtocolT :: writeI16 (int16_t) [с Transport_ = apache :: thrift :: transport :: TTransport] â: /usr / local / include / thrift / protocol / TVirtualProtocol.h: 401: создается из âuint32_t apache :: thrift :: protocol :: TVirtualProtocol :: writeI16_virt (int16_t) [с Protocol_ = apache :: thrift :: protocol :: TBinaryProtocolT,Super_ = apache :: thrift :: protocol :: TProtocolDefaults] â Something_server.skeleton.cpp: 42: создается здесь / usr / local / includede / thrift / protocol / TBinaryProtocol.tcc: 147: ошибка: в этой области не было объявлено âhtonsâ /usr/local/include/thrift/protocol/TBinaryProtocol.tcc: в функции-член âuint32_t apache :: thrift :: protocol :: TBinaryProtocolT:: writeI32 (int32_t) [с Transport_ = apache :: thrift :: transport :: TTransport] â: /usr/local/include/thrift/protocol/TVirtualProtocol.h:405: создается из âuint32_t apache :: thrift :: protocol:: TVirtualProtocol :: writeI32_virt (int32_t) [с 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] â:

Ответы [ 3 ]

5 голосов
/ 01 февраля 2012

В моей системе (Ubuntu 10.10) htons () и htonl () объявлены в netinet / in.h.

У меня была та же ошибка, и я исправил ее, добавив -DHAVE_NETINET_IN_H к параметрам командной строки g ++ при сборке моего Thrift-сервера.

Это заставит препроцессор включить netinet / in.h в thrift / protocol / TPrototol.h, поэтому объявления hton * будут видны компилятору.

TProtocol.h содержит следующие строки, которые вызывают ошибку компилятора, когда HAVE_NETINET_IN_H не определено.

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

Это может быть ошибка в скрипте настройки Thrift, которая каким-то образом пропускает определение.

2 голосов
/ 27 декабря 2011

похоже, что у вас проблема с отсутствующими функциями htons (), htonl (), вы включили правильный заголовок?

#include <arpa/inet.h>

1 голос
/ 02 февраля 2012

С Гман вам нужно несколько # определений.Добавьте -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}
...