链接共享库也链接了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
我目前正在尝试在 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