链接共享库,该库还链接cmake中的其他共享库 我现在正在尝试在Ubuntu中创建一个C++程序,它嵌入了一个共享库。为此,我在本地拥有.so文件(在我的示例中为:libSimpleAmqpClient.so)
库本身也调用预安装的共享库(在我的例子中是librabbitmq.so和librabbitmq.so.4) 我使用以下CMAKE代码:链接共享库,该库还链接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
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/
或者按照此处给出的方法进行操作这是否回答了您的问题?