链接共享库也链接了cmake中的不同共享库

Linking shared library that also links a different shared library in cmake

我目前正在尝试在 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;

但我当然不想那样做。那么,有没有一种方法可以只使用一个共享库,而自动包含其他所需的共享库?

共享库文件可以在执行过程中自行识别它们的依赖关系,前提是您在编译过程中已经链接了它们

这里有一个 Link 可以阅读。 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 文件中找到.

但是在运行时,OS 将仅在 LD_LIBRARY_PATH 设置的路径中查找所需的 .so 文件(除非另有说明)

因此给定的错误消息 error while loading shared libraries: librabbitmq.so.4: cannot open shared object file: No such file or directory 意味着在运行时可执行文件无法在 LD_LIBRARY_PATH

提到的路径中找到 librabbitmq.so.4 文件

鉴于,您的 OS 是基于 debian 的,您可以尝试在终端中执行此操作,在 运行 您的程序

之前

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/

或者按照这里给出的方法How to set the environmental variable LD_LIBRARY_PATH in linux