如何使用依赖于另一个静态库的静态库进行编译
问题描述:
如何使用依赖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}
答
原来,即使你正在链接一个静态库,你仍然需要链接库依赖关系。我已经设法用这种语法编译它
g++ test_simpleamqpclient.cpp -o test_simpleamqpclient -lSimpleAmqpClient -lboost_chrono -lboost_system -lrabbitmq -lrt -lssl
希望这会帮助别人。
静态库AFAIK不包含任何依赖关系信息。只有需要解决的未解决符号列表。因此必须在链接期间直接指定所有静态库。 –
@DanielJour附带'librabbitmq.a'的示例代码编译并正确运行。但是,我不能说'libSimpleAmqpClient.a'。有没有一种方法来验证它是静态构建的(并且不依赖于其他库)? –
不完全确定,但是'nm -u lib.a'应该显示无法解析的符号。 –