2017-03-09 42 views
0

如何使用依賴boost和其他靜態庫的靜態庫編譯代碼?如何使用依賴於另一個靜態庫的靜態庫進行編譯

我已經試過

g++ -lSimpleAmqpClient test_simpleamqpclient.cpp -o test_simpleamqpclient 

g++ -lrabbitmq -lSimpleAmqpClient test_simpleamqpclient.cpp -o test_simpleamqpclient 

test_simpleamqpclient.cpp

#include "SimpleAmqpClient/SimpleAmqpClient.h" 

int main(){ 
    AmqpClient::BasicMessage::ptr_t message = AmqpClient::BasicMessage::Create(); 
    return 0; 
} 

/usr/local/include/SimpleAmqpClient/SimpleAmqpClient.h

: 
#include "SimpleAmqpClient/BasicMessage.h" 
: 

我越來越

/tmp/ccMsTz9s.o: In function `boost::detail::sp_if_not_array<AmqpClient::BasicMessage>::type boost::make_shared<AmqpClient::BasicMessage>()': 
test_simpleamqpclient.cpp:(.text._ZN5boost11make_sharedIN10AmqpClient12BasicMessageEEENS_6detail15sp_if_not_arrayIT_E4typeEv[_ZN5boost11make_sharedIN10AmqpClient12BasicMessageEEENS_6detail15sp_if_not_arrayIT_E4typeEv]+0x62): undefined reference to `AmqpClient::BasicMessage::BasicMessage()' 
collect2: error: ld returned 1 exit status 

靜態庫,libSimpleAmqpClient.a

libSimpleAmqpClient.pc

prefix=/usr/local 
exec_prefix=${prefix} 
libdir=${exec_prefix}/lib 
includedir=${prefix}/include 

Name: SimpleAmqpClient 
Description: C++ wrapper of rabbitmq-c AMQP client library 
Version: 2.5.0 
Requires.private: librabbitmq 
Libs: -L${libdir} -lSimpleAmqpClient 
Libs.private: -L/usr/local/lib -lboost_chrono -lboost_system 
CFlags: -I${includedir} 

它依賴於升壓和另一個庫,librabbitmq.a

librabbitmq.pc

prefix=/usr/local 
exec_prefix=${prefix} 
libdir=${exec_prefix}/lib64 
includedir=${prefix}/include 

Name: rabbitmq-c 
Description: An AMQP 0-9-1 client library 
Version: 0.8.1 
URL: https://github.com/alanxz/rabbitmq-c 
Requires.private: 
Libs: -L${libdir} -lrabbitmq 
Libs.private: rt;-lpthread 
CFlags: -I${includedir} 
+0

靜態庫AFAIK不包含任何依賴關係信息。只有需要解決的未解決符號列表。因此必須在鏈接期間直接指定所有靜態庫。 –

+0

@DanielJour附帶'librabbitmq.a'的示例代碼編譯並正確運行。但是,我不能說'libSimpleAmqpClient.a'。有沒有一種方法來驗證它是靜態構建的(並且不依賴於其他庫)? –

+0

不完全確定,但是'nm -u lib.a'應該顯示無法解析的符號。 –

回答

0

原來,即使你正在鏈接一個靜態庫,你仍然需要鏈接庫依賴關係。我已經設法用這種語法編譯它

g++ test_simpleamqpclient.cpp -o test_simpleamqpclient -lSimpleAmqpClient -lboost_chrono -lboost_system -lrabbitmq -lrt -lssl 

希望這會幫助別人。