【发布时间】:2021-07-25 22:49:01
【问题描述】:
我目前正在尝试在 Ubuntu 中创建一个嵌入共享库的 C++ 程序。为此,我在本地有 .so 文件(在我的例子中:libSimpleAmqpClient.so)。
库本身也调用预安装的共享库(在我的例子中:librabbitmq.so 和 librabbitmq.so.4)。
我使用以下 CMAKE 代码:
cmake_minimum_required(VERSION 3.19)
project(AMQPListener)
## Add SimpleAMQP library headers ##
include_directories(/usr/local/SimpleAmqplient)
## Add RabbitMQ library headers ##
include_directories(/usr/local/rabbitmq-c)
# Create program executable
add_executable(AMQPListener main.cpp)
target_link_libraries(AMQPListener /usr/local/lib/librabbitmq.so.4)
target_link_libraries(AMQPListener /usr/local/lib/librabbitmq.so)
target_link_libraries(AMQPListener /usr/local/lib/libSimpleAmqpClient.so)
main.cpp 文件如下所示:
#include "SimpleAmqpClient/SimpleAmqpClient.h"
int main() {
AmqpClient::Channel::OpenOpts opts;
opts.port = 5672;
opts.host = "192.0.2.255";
opts.auth = AmqpClient::Channel::OpenOpts::BasicAuth("guest", "guest");
AmqpClient::Channel::ptr_t channel = AmqpClient::Channel::Open(opts);
return 0;
}
它编译得很好。但在运行时,我收到以下错误消息:
加载共享库时出错:librabbitmq.so.4:无法打开共享对象文件:没有这样的文件或目录
但是,如果我直接从共享库中调用我想要包含的实际库调用的一些函数,它就可以正常工作:
#include "amqp.h"
#include "SimpleAmqpClient/SimpleAmqpClient.h"
int main() {
amqp_connection_state_t conn;
conn = amqp_new_connection();
AmqpClient::Channel::OpenOpts opts;
opts.port = 5672;
opts.host = "192.0.2.255";
opts.auth = AmqpClient::Channel::OpenOpts::BasicAuth("guest", "guest");
AmqpClient::Channel::ptr_t channel = AmqpClient::Channel::Open(opts);
return 0;
但我当然不想那样做。那么,有没有一种方法可以让我只使用一个共享库而自动包含其他需要的共享库?
【问题讨论】:
标签: c++ ubuntu cmake shared-libraries amqp