2012-03-31 29 views
6

Tôi mới đến Tiết kiệm. Tôi nghĩ rằng tôi đã cài đặt chính xác. Tôi có libs folowing:Lỗi biên dịch mã cpp mẫu tiết kiệm

[email protected]:~/code/thrift-0.8.0/tutorial/cpp$ ll /usr/local/lib/ 

total 11496 
drwxr-xr-x 4 root root  4096 Mar 23 19:35 ./ 
drwxr-xr-x 10 root root  4096 Oct 12 22:27 ../ 
-rwxr-xr-x 1 root root 4100463 Mar 31 20:26 libthrift-0.8.0.so* 
-rw-r--r-- 1 root root 7256552 Mar 31 20:26 libthrift.a 
-rwxr-xr-x 1 root root  991 Mar 31 20:26 libthrift.la* 
lrwxrwxrwx 1 root root  18 Mar 23 19:35 libthrift.so -> libthrift-0.8.0.so* 
-rwxr-xr-x 1 root root 160727 Mar 31 20:26 libthriftz-0.8.0.so* 
-rw-r--r-- 1 root root 218290 Mar 31 20:26 libthriftz.a 
-rwxr-xr-x 1 root root  998 Mar 31 20:26 libthriftz.la* 
lrwxrwxrwx 1 root root  19 Mar 23 19:35 libthriftz.so -> libthriftz-0.8.0.so* 

Sau đó, tôi tryed để biên dịch các hướng dẫn cppClient nhưng tôi có "không xác định tham khảo" lỗi như sau:

[email protected]:~/code/thrift-0.8.0/tutorial/cpp$ sudo g++ -DHAVE_NETINET_IN_H -o Server -I/usr/local/include/thrift/ -I/usr/local/boost/include/boost-1_33_1/ -I../gen-cpp -L/usr/local/lib/ -lthrift CppServer.cpp ../gen-cpp/SharedService.cpp ../gen-cpp/shared_types.cpp ../gen-cpp/tutorial_types.cpp ../gen-cpp/Calculator.cpp 
/tmp/cc7lnwSw.o: In function `main': 
CppServer.cpp:(.text+0xd1): undefined reference to `apache::thrift::transport::TServerSocket::TServerSocket(int)' 
CppServer.cpp:(.text+0x15f): undefined reference to `apache::thrift::server::TSimpleServer::serve()' 
/tmp/cc7lnwSw.o: In function `apache::thrift::server::TSimpleServer::~TSimpleServer()': 
CppServer.cpp:(.text._ZN6apache6thrift6server13TSimpleServerD2Ev[_ZN6apache6thrift6server13TSimpleServerD5Ev]+0xb): undefined reference to `vtable for apache::thrift::server::TSimpleServer' 
/tmp/cc7lnwSw.o: In function `apache::thrift::transport::TBufferedTransport::TBufferedTransport(boost::shared_ptr<apache::thrift::transport::TTransport>)': 
CppServer.cpp:(.text._ZN6apache6thrift9transport18TBufferedTransportC2EN5boost10shared_ptrINS1_10TTransportEEE[_ZN6apache6thrift9transport18TBufferedTransportC5EN5boost10shared_ptrINS1_10TTransportEEE]+0x17): undefined reference to `vtable for apache::thrift::transport::TBufferedTransport' 
/tmp/cc7lnwSw.o: In function `apache::thrift::server::TSimpleServer::TSimpleServer<apache::thrift::TProcessor>(boost::shared_ptr<apache::thrift::TProcessor> const&, boost::shared_ptr<apache::thrift::transport::TServerTransport> const&, boost::shared_ptr<apache::thrift::transport::TTransportFactory> const&, boost::shared_ptr<apache::thrift::protocol::TProtocolFactory> const&, boost::enable_if<boost::is_convertible<apache::thrift::TProcessor*, apache::thrift::TProcessor*>::type, void*>::type)': 
CppServer.cpp:(.text._ZN6apache6thrift6server13TSimpleServerC2INS0_10TProcessorEEERKN5boost10shared_ptrIT_EERKNS6_INS0_9transport16TServerTransportEEERKNS6_INSB_17TTransportFactoryEEERKNS6_INS0_8protocol16TProtocolFactoryEEENS5_9enable_ifINS5_14is_convertibleIPS7_PS4_E4typeEPvE4typeE[_ZN6apache6thrift6server13TSimpleServerC5INS0_10TProcessorEEERKN5boost10shared_ptrIT_EERKNS6_INS0_9transport16TServerTransportEEERKNS6_INSB_17TTransportFactoryEEERKNS6_INS0_8protocol16TProtocolFactoryEEENS5_9enable_ifINS5_14is_convertibleIPS7_PS4_E4typeEPvE4typeE]+0x3a): undefined reference to `vtable for apache::thrift::server::TSimpleServer' 
/tmp/cc7lnwSw.o: In function `apache::thrift::protocol::TBinaryProtocolT<apache::thrift::transport::TTransport>::writeMessageBegin(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, apache::thrift::protocol::TMessageType, int)': 
CppServer.cpp:(.text._ZN6apache6thrift8protocol16TBinaryProtocolTINS0_9transport10TTransportEE17writeMessageBeginERKSsNS1_12TMessageTypeEi[apache::thrift::protocol::TBinaryProtocolT<apache::thrift::transport::TTransport>::writeMessageBegin(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, apache::thrift::protocol::TMessageType, int)]+0x15): undefined reference to `apache::thrift::protocol::TBinaryProtocolT<apache::thrift::transport::TTransport>::VERSION_1' 
/tmp/cc7lnwSw.o: In function `apache::thrift::protocol::TBinaryProtocolT<apache::thrift::transport::TTransport>::readMessageBegin(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, apache::thrift::protocol::TMessageType&, int&)': 
CppServer.cpp:(.text._ZN6apache6thrift8protocol16TBinaryProtocolTINS0_9transport10TTransportEE16readMessageBeginERSsRNS1_12TMessageTypeERi[apache::thrift::protocol::TBinaryProtocolT<apache::thrift::transport::TTransport>::readMessageBegin(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, apache::thrift::protocol::TMessageType&, int&)]+0x33): undefined reference to `apache::thrift::protocol::TBinaryProtocolT<apache::thrift::transport::TTransport>::VERSION_MASK' 
CppServer.cpp:(.text._ZN6apache6thrift8protocol16TBinaryProtocolTINS0_9transport10TTransportEE16readMessageBeginERSsRNS1_12TMessageTypeERi[apache::thrift::protocol::TBinaryProtocolT<apache::thrift::transport::TTransport>::readMessageBegin(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, apache::thrift::protocol::TMessageType&, int&)]+0x3d): undefined reference to `apache::thrift::protocol::TBinaryProtocolT<apache::thrift::transport::TTransport>::VERSION_1' 
/tmp/ccBkDvwC.o: In function `shared::SharedServiceClient::recv_getStruct(shared::SharedStruct&)': 
SharedService.cpp:(.text+0x6f3): undefined reference to `apache::thrift::TApplicationException::read(apache::thrift::protocol::TProtocol*)' 
/tmp/ccBkDvwC.o: In function `shared::SharedServiceProcessor::process(boost::shared_ptr<apache::thrift::protocol::TProtocol>, boost::shared_ptr<apache::thrift::protocol::TProtocol>, void*)': 
SharedService.cpp:(.text+0xb05): undefined reference to `apache::thrift::TApplicationException::write(apache::thrift::protocol::TProtocol*) const' 
/tmp/ccBkDvwC.o: In function `shared::SharedServiceProcessor::process_fn(apache::thrift::protocol::TProtocol*, apache::thrift::protocol::TProtocol*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, int, void*)': 
SharedService.cpp:(.text+0xd87): undefined reference to `apache::thrift::TApplicationException::write(apache::thrift::protocol::TProtocol*) const' 
/tmp/ccBkDvwC.o: In function `shared::SharedServiceProcessor::process_getStruct(int, apache::thrift::protocol::TProtocol*, apache::thrift::protocol::TProtocol*, void*)': 
SharedService.cpp:(.text+0x1409): undefined reference to `apache::thrift::TApplicationException::write(apache::thrift::protocol::TProtocol*) const' 
/tmp/ccLRxoVZ.o: In function `tutorial::CalculatorClient::recv_ping()': 
Calculator.cpp:(.text+0x12af): undefined reference to `apache::thrift::TApplicationException::read(apache::thrift::protocol::TProtocol*)' 
/tmp/ccLRxoVZ.o: In function `tutorial::CalculatorClient::recv_add()': 
Calculator.cpp:(.text+0x173b): undefined reference to `apache::thrift::TApplicationException::read(apache::thrift::protocol::TProtocol*)' 
/tmp/ccLRxoVZ.o: In function `tutorial::CalculatorClient::recv_calculate()': 
Calculator.cpp:(.text+0x1c7b): undefined reference to `apache::thrift::TApplicationException::read(apache::thrift::protocol::TProtocol*)' 
/tmp/ccLRxoVZ.o: In function `tutorial::CalculatorProcessor::process(boost::shared_ptr<apache::thrift::protocol::TProtocol>, boost::shared_ptr<apache::thrift::protocol::TProtocol>, void*)': 
Calculator.cpp:(.text+0x227f): undefined reference to `apache::thrift::TApplicationException::write(apache::thrift::protocol::TProtocol*) const' 
/tmp/ccLRxoVZ.o: In function `tutorial::CalculatorProcessor::process_ping(int, apache::thrift::protocol::TProtocol*, apache::thrift::protocol::TProtocol*, void*)': 
Calculator.cpp:(.text+0x298e): undefined reference to `apache::thrift::TApplicationException::write(apache::thrift::protocol::TProtocol*) const' 
/tmp/ccLRxoVZ.o: In function `tutorial::CalculatorProcessor::process_add(int, apache::thrift::protocol::TProtocol*, apache::thrift::protocol::TProtocol*, void*)': 
Calculator.cpp:(.text+0x2f9b): undefined reference to `apache::thrift::TApplicationException::write(apache::thrift::protocol::TProtocol*) const' 
/tmp/ccLRxoVZ.o: In function `tutorial::CalculatorProcessor::process_calculate(int, apache::thrift::protocol::TProtocol*, apache::thrift::protocol::TProtocol*, void*)': 
Calculator.cpp:(.text+0x3609): undefined reference to `apache::thrift::TApplicationException::write(apache::thrift::protocol::TProtocol*) const' 
collect2: ld returned 1 exit status 
+0

lệnh của tôi là: sudo g ++ -DHAVE_NETINET_IN_H -o server -I/usr/local/include/tiết kiệm/-I/usr/local/boost/include/boost-1_33_1/-I ../ gen-cpp -L/usr/local/lib/-lthrift CppServer.cpp ../gen-cpp/SharedService.cpp ../gen-cpp/shared_types.cpp ../gen-cpp/tutorial_types.cpp ../gen-cpp/Calculator.cpp –

+0

tại sao bạn gọi g ++ là root? thử mà không có, nhưng hãy thử chạy ldconfig (như là người chủ) đầu tiên –

Trả lời

8

Tùy chọn -lthrift nên ở phần cuối của dòng lệnh, sau tệp cpp.

tôi đã biên soạn thành công mẫu trên Ubuntu 11.10/gcc 4.6.1/tăng 1,49 với makefile sau:

THRIFT_VER =thrift-0.8.0 
USR_DIR =${HOME}/usr 
THRIFT_DIR =${USR_DIR}/${THRIFT_VER} 
INCS_DIRS =-I${USR_DIR}/include -I${THRIFT_DIR}/include/thrift 
LIBS_DIRS =-L${USR_DIR}/lib -L${USR_DIR}/${THRIFT_VER}/lib 
CPP_DEFS =-D=HAVE_CONFIG_H 
CPP_OPTS =-Wall -O2 
LIBS  =-lthrift 

GEN_SRC = ../gen-cpp/SharedService.cpp \ 
      ../gen-cpp/shared_types.cpp \ 
      ../gen-cpp/tutorial_types.cpp \ 
      ../gen-cpp/Calculator.cpp 
GEN_INC = -I../gen-cpp 

default: server client 

server: CppServer.cpp 
    g++ ${CPP_OPTS} ${CPP_DEFS} -o CppServer ${GEN_INC} ${INCS_DIRS} CppServer.cpp ${GEN_SRC} ${LIBS_DIRS} ${LIBS} 

client: CppClient.cpp 
    g++ ${CPP_OPTS} ${CPP_DEFS} -o CppClient ${GEN_INC} ${INCS_DIRS} CppClient.cpp ${GEN_SRC} ${LIBS_DIRS} ${LIBS} 

clean: 
    $(RM) -r CppClient CppServer 

Hãy cẩn thận khi đặt tab ở đầu các lệnh làm.

bố trí của tôi là:

tăng 1,49 cài đặt trong $ {HOME}/usr
tăng tiêu đề trong $ {HOME}/usr/include
libs tăng trong $ {HOME}/usr/lib

tiết kiệm 0.8.0 được cài đặt trong $ {HOME} /usr/thrift-0.8.0
tiêu đề tiết kiệm trong $ {HOME} /usr/thrift-0.8.0/include
libs hành tiết kiệm trong $ {HOME} /usr/thrift-0.8.0/lib

Để chạy các mẫu:

#!/bin/bash 
THRIFT_VER=thrift-0.8.0 
USR_DIR=${HOME}/usr 
THRIFT_DIR=${USR_DIR}/${THRIFT_VER} 
export LD_LIBRARY_PATH=${THRIFT_DIR}/lib:${LD_LIBRARY_PATH} 
exec $1 
+0

Hoàn hảo !!!!!! Bạn cực kỳ tử tế. Cảm ơn nhiều! –

+0

thay đổi "CPP_DEFS = -D = HAVE_CONFIG_H" thành "CPP_DEFS = -D = HAVE_NETINET_IN_H" trong trường hợp của tôi. – christophe

+0

tại sao '-lthrift' phải ở cuối dòng? Nó hoạt động. – bits

0

sau khi một số tìm kiếm tôi có thể tìm ra lý do ... Đó là vì g của bạn ++ 's phiên bản ... trong ngắn hạn, gcc làm việc là:

g ++ 4.4.6: OK g ++ 4.5.3: OK g ++ 4.6.1: phàn nàn về tài liệu tham khảo không xác định để

liên kết: http://mail-archives.apache.org/mod_mbox/thrift-user/201107.mbox/%[email protected]%3E

http://mail-archives.apache.org/mod_mbox/thrift-dev/201107.mbox/%[email protected]%3E

+0

Vâng, bạn nói đúng, g ++ 4.6.1 phải thêm đối số -O1 hoặc -O2, tôi sử dụng Makefile của josendf, giải quyết mọi vấn đề, cảm ơn anyway ^^ –

0

Dưới đây là một ví dụ cho Os X.

Đầu tiên cài đặt phụ thuộc và tiết kiệm riêng của mình, đơn giản nhất để làm với brew:

brew install boost 
brew install thrift 

Lưu ý rằng nếu bạn đã đã cố gắng để cài đặt tiết kiệm bằng tay, bạn có thể phải gỡ bỏ nó trước.

Download thrift và biên dịch hướng dẫn:

cd ./thrift-0.8.0/tutorial 
thrift --gen cpp ./tutorial.thrift 
cd ./cpp 

Thay Makefile hiện với sau (dựa trên giải pháp jedf):

THRIFT_VER =thrift/0.8.0 
USR_DIR =/usr/local/Cellar 
THRIFT_DIR =${USR_DIR}/${THRIFT_VER} 
INCS_DIRS =-I${USR_DIR}/include -I${THRIFT_DIR}/include/thrift -I${USR_DIR}/boost/1.49.0/include/boost 
LIBS_DIRS =-L${USR_DIR}/${THRIFT_VER}/lib 
CPP_DEFS =-D=HAVE_CONFIG_H 
CPP_OPTS =-Wall -O2 
LIBS  =-lthrift 

GEN_SRC = ../gen-cpp/SharedService.cpp \ 
      ../gen-cpp/shared_types.cpp \ 
      ../gen-cpp/tutorial_types.cpp \ 
      ../gen-cpp/Calculator.cpp 
GEN_INC = -I../gen-cpp 

default: server client 

server: CppServer.cpp 
     g++ ${CPP_OPTS} ${CPP_DEFS} -o CppServer ${GEN_INC} ${INCS_DIRS} CppServer.cpp ${GEN_SRC} ${LIBS_DIRS} ${LIBS} 

client: CppClient.cpp 
     g++ ${CPP_OPTS} ${CPP_DEFS} -o CppClient ${GEN_INC} ${INCS_DIRS} CppClient.cpp ${GEN_SRC} ${LIBS_DIRS} ${LIBS} 

clean: 
     $(RM) -r CppClient CppServer 

Compile:

make 

Chạy máy chủ và khách hàng:

./CppServer 
./CppClient 

Bên cạnh đó, bất cứ khi nào bạn cần phải biên dịch mã của bên thứ ba mà đòi hỏi tiết kiệm sử dụng như sau:

export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/Cellar/thrift/0.8.0/lib/pkgconfig/ 
Các vấn đề liên quan