【问题标题】:Linking shared library that also links a different shared library in cmake链接共享库,它也链接了 cmake 中的不同共享库
【发布时间】: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


【解决方案1】:

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

这是一个阅读链接。 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 意味着在运行期间可执行文件在LD_LIBRARY_PATH 提到的路径中找不到librabbitmq.so.4 文件

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 2016-01-08
    • 1970-01-01
    • 2012-09-30
    相关资源
    最近更新 更多