2011-09-07 68 views
2

我試圖用C++來訪問Cassandra,並使用Thrift。鏈接切換順序很重要嗎?

複製的例子,我有這個奇怪的情況:

[email protected]:~/Script/goh-server/src/cassandra$ g++ -I/usr/include/thrift/ -c prova.cpp -o prova.o 
[email protected]:~/Script/goh-server/src/cassandra$ g++ -I/usr/include/thrift/ -c cassandra_constants.cpp -o cassandra_constants.o 
[email protected]:~/Script/goh-server/src/cassandra$ g++ -I/usr/include/thrift/ -c cassandra_types.cpp -o cassandra_types.o 
[email protected]:~/Script/goh-server/src/cassandra$ g++ -I/usr/include/thrift/ -c Cassandra.cpp -o Cassandra.o 
[email protected]:~/Script/goh-server/src/cassandra$ g++ -lthrift *.o -o prova 
Cassandra.o: In function `org::apache::cassandra::CassandraClient::recv_login()': 
Cassandra.cpp:(.text+0x12d2c): undefined reference to `apache::thrift::TApplicationException::read(apache::thrift::protocol::TProtocol*)' 
Cassandra.o: In function `org::apache::cassandra::CassandraClient::recv_set_keyspace()': 
Cassandra.cpp:(.text+0x1339c): undefined reference to `apache::thrift::TApplicationException::read(apache::thrift::protocol::TProtocol*)' 
Cassandra.o: In function `org::apache::cassandra::CassandraClient::recv_get(org::apache::cassandra::ColumnOrSuperColumn&)': 
Cassandra.cpp:(.text+0x13a0b): undefined reference to `apache::thrift::TApplicationException::read(apache::thrift::protocol::TProtocol*)' 
Cassandra.o: In function `org::apache::cassandra::CassandraClient::recv_get_slice(std::vector<org::apache::cassandra::ColumnOrSuperColumn, std::allocator<org::apache::cassandra::ColumnOrSuperColumn> >&)': 
Cassandra.cpp:(.text+0x142db): undefined reference to `apache::thrift::TApplicationException::read(apache::thrift::protocol::TProtocol*)' 
Cassandra.o: In function `org::apache::cassandra::CassandraClient::recv_get_count()': 
Cassandra.cpp:(.text+0x14b40): undefined reference to `apache::thrift::TApplicationException::read(apache::thrift::protocol::TProtocol*)' 
Cassandra.o:Cassandra.cpp:(.text+0x153bd): more undefined references to `apache::thrift::TApplicationException::read(apache::thrift::protocol::TProtocol*)' follow 
Cassandra.o: In function `org::apache::cassandra::CassandraProcessor::process(boost::shared_ptr<apache::thrift::protocol::TProtocol>, boost::shared_ptr<apache::thrift::protocol::TProtocol>, void*)': 
Cassandra.cpp:(.text+0x21511): undefined reference to `apache::thrift::TApplicationException::write(apache::thrift::protocol::TProtocol*) const' 
Cassandra.o: In function `org::apache::cassandra::CassandraProcessor::process_fn(apache::thrift::protocol::TProtocol*, apache::thrift::protocol::TProtocol*, std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, int, void*)': 
Cassandra.cpp:(.text+0x21882): undefined reference to `apache::thrift::TApplicationException::write(apache::thrift::protocol::TProtocol*) const' 
Cassandra.o: In function `org::apache::cassandra::CassandraProcessor::process_login(int, apache::thrift::protocol::TProtocol*, apache::thrift::protocol::TProtocol*, void*)': 
Cassandra.cpp:(.text+0x21fa8): undefined reference to `apache::thrift::TApplicationException::write(apache::thrift::protocol::TProtocol*) const' 
Cassandra.o: In function `org::apache::cassandra::CassandraProcessor::process_set_keyspace(int, apache::thrift::protocol::TProtocol*, apache::thrift::protocol::TProtocol*, void*)': 
Cassandra.cpp:(.text+0x2291e): undefined reference to `apache::thrift::TApplicationException::write(apache::thrift::protocol::TProtocol*) const' 
Cassandra.o: In function `org::apache::cassandra::CassandraProcessor::process_get(int, apache::thrift::protocol::TProtocol*, apache::thrift::protocol::TProtocol*, void*)': 
Cassandra.cpp:(.text+0x233b9): undefined reference to `apache::thrift::TApplicationException::write(apache::thrift::protocol::TProtocol*) const' 
Cassandra.o:Cassandra.cpp:(.text+0x23e16): more undefined references to `apache::thrift::TApplicationException::write(apache::thrift::protocol::TProtocol*) const' follow 
prova.o: In function `main': 
prova.cpp:(.text+0x6e): undefined reference to `apache::thrift::transport::TSocket::TSocket(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int)' 
prova.o: In function `apache::thrift::transport::TFramedTransport::TFramedTransport(boost::shared_ptr<apache::thrift::transport::TTransport>)': 
prova.cpp:(.text._ZN6apache6thrift9transport16TFramedTransportC1EN5boost10shared_ptrINS1_10TTransportEEE[apache::thrift::transport::TFramedTransport::TFramedTransport(boost::shared_ptr<apache::thrift::transport::TTransport>)]+0x26): undefined reference to `vtable for apache::thrift::transport::TFramedTransport' 
collect2: ld returned 1 exit status 
[email protected]:~/Script/goh-server/src/cassandra$ ls 
cassandra_constants.cpp cassandra_constants.o Cassandra.h cassandra_types.cpp cassandra_types.o prova.o 
cassandra_constants.h Cassandra.cpp   Cassandra.o cassandra_types.h prova.cpp 

然後,有一些巫術我試圖在連接順序的末尾移動-l開關,並奇蹟般地...

[email protected]:~/Script/goh-server/src/cassandra$ g++ *.o -o prova -lthrift 
[email protected]:~/Script/goh-server/src/cassandra$ 

在Thrift文檔中,-l開關放在開頭,實際上automake會把它放在'* .o's和-o開關之前。

它有什麼問題?

編輯:

其實是不正確的,automake的投入-l標誌的開始。它確實把它們放到了連接階段。仍然:訂單爲什麼重要?

回答

2

它很重要。 -llibrary必須遵循引用該庫的所有內容。

如果您在靜態庫之間有循環引用,則最終會使用-llibrary兩次。

+3

http://webpages.charter.net/ppluzhnikov/linker.html有血淋淋的細節。 –