gpt4 book ai didi

c++ - 链接共享库,它也链接了 cmake 中的不同共享库

转载 作者:行者123 更新时间:2023-12-04 18:43:06 25 4
gpt4 key购买 nike

我目前正在尝试在 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;
}
它编译得很好。但是在运行时,我收到以下错误消息:

error while loading shared libraries: librabbitmq.so.4: cannot open shared object file: No such file or directory


但它工作正常,如果我直接从共享库中调用一些函数,这些函数由我想包含的实际库调用:
#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;
但我当然不想那样做。那么,有没有一种方法可以让我只使用一个共享库而自动包含其他需要的共享库?

最佳答案

共享库文件可以在执行过程中自行识别它们的依赖关系,假设您在编译过程中已链接它们
这是一个阅读链接。 Linking with dynamic library with dependencies
下面的 cmake 代码确保编译器(链接器)在下面的 .so 文件中找到所有必需的函数定义

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)
因为,这些不是静态库文件 (***.a) ,库函数定义不会出现在可执行文件本身中,而是可执行文件将有一条指令,说明这些指令可以在 .so 文件中找到。
但是在运行时,操作系统只会在 LD_LIBRARY_PATH 设置的路径中查找所需的 .so 文件(除非另有说明)
所以给定的错误信息 error while loading shared libraries: librabbitmq.so.4: cannot open shared object file: No such file or directory表示在运行时可执行文件找不到 librabbitmq.so.4 LD_LIBRARY_PATH 提到的路径中的文件
鉴于,您的操作系统是基于 debian 的,您可以在运行程序之前尝试在终端中执行此操作 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/或者按照这里给出的方法 How to set the environmental variable LD_LIBRARY_PATH in linux

关于c++ - 链接共享库,它也链接了 cmake 中的不同共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67370379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com