链接共享库,该库还链接cmake中的其他共享库 我现在正在尝试在Ubuntu中创建一个C++程序,它嵌入了一个共享库。为此,我在本地拥有.so文件(在我的示例中为:libSimpleAmqpClient.so)

链接共享库,该库还链接cmake中的其他共享库 我现在正在尝试在Ubuntu中创建一个C++程序,它嵌入了一个共享库。为此,我在本地拥有.so文件(在我的示例中为:libSimpleAmqpClient.so),c++,ubuntu,cmake,shared-libraries,amqp,C++,Ubuntu,Cmake,Shared Libraries,Amqp,库本身也调用预安装的共享库(在我的例子中是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 ## i

库本身也调用预安装的共享库(在我的例子中是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;

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

如果您在编译过程中链接了这些共享库文件,那么这些共享库文件可以在执行过程中自行识别它们的依赖关系

这里有一个链接可以阅读

下面的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:librabbitmq.So.4:无法打开共享对象文件:没有这样的文件或目录
意味着在运行时,可执行文件无法在
LD\u LIBRARY\u PATH
中提到的路径中找到
librabbitmq.So.4
文件

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

export-LD\u LIBRARY\u PATH=$LD\u LIBRARY\u PATH:/usr/local/lib/


或者按照此处给出的方法进行操作

这是否回答了您的问题?