我正在尝试构建rabbitmq-c作为一个静态库,这样我就可以在AWS中使用了。
我能够在文档后面构建示例,这些示例运行良好。
但现在我正尝试在我自己的项目中使用。以下是我所采取的步骤:
下面是我的CMakeLists.txt
cmake_minimum_required(VERSION 3.1)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_BUILD_TYPE "Release")
project(executable LANGUAGES CXX)
SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
SET(BUILD_SHARED_LIBS OFF)
set(RABBITMQ_TARGET "<absolute_path_to_third_party_dir>/third_party/rabbitmq-c/")
add_definitions(-DAMQP_STATIC)
add_subdirectory(${RABBITMQ_TARGET})
include_directories(${LIBRABBITMQ_INCLUDE_DIRS})
add_executable(${PROJECT_NAME} execute_code.cpp)
target_link_libraries(executable PRIVATE ${RMQ_LIBRARY_TARGET})cmake .. -DBUILD_EXAMPLES=OFF -DBUILD_SHARED_LIBS=OFF (没有任何问题)。fatal error: amqp.h: No such file or directory
compilation terminated.
CMakeFiles/executable.dir/build.make:62: recipe for target 'CMakeFiles/executable.dir/execute_code.cpp.o' failed
make[2]: *** [CMakeFiles/executable.dir/execute_code.cpp.o] Error 1
CMakeFiles/Makefile2:169: recipe for target 'CMakeFiles/executable.dir/all' failed
make[1]: *** [CMakeFiles/executable.dir/all] Error 2
Makefile:129: recipe for target 'all' failed
make: *** [all] Error 2这是我的execute_code.cpp (我只是在这里删除不必要的代码)
#include<iostream>
#include <amqp.h>
#include <amqp_tcp_socket.h>
using namespace std;
int main(int argc, char** argv) {
char const *hostname;
int port, status;
char const *exchange;
char const *bindingkey;
amqp_socket_t *socket = NULL;
amqp_connection_state_t conn;
amqp_bytes_t queuename;
conn = amqp_new_connection();
socket = amqp_tcp_socket_new(conn);
return 0;
}当我不使用
#include <amqp.h>
#include <amqp_tcp_socket.h>我可以构建兔子-静态的,下面是作出反应
Scanning dependencies of target rabbitmq-static
[ 35%] Building C object third_party/rabbitmq-c/librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_framing.c.o
[ 37%] Building C object third_party/rabbitmq-c/librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_api.c.o
[ 40%] Building C object third_party/rabbitmq-c/librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_connection.c.o
[ 42%] Building C object third_party/rabbitmq-c/librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_mem.c.o
[ 44%] Building C object third_party/rabbitmq-c/librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_socket.c.o
[ 46%] Building C object third_party/rabbitmq-c/librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_table.c.o
[ 48%] Building C object third_party/rabbitmq-c/librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_url.c.o
[ 51%] Building C object third_party/rabbitmq-c/librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_tcp_socket.c.o
[ 53%] Building C object third_party/rabbitmq-c/librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_time.c.o
[ 55%] Building C object third_party/rabbitmq-c/librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_consumer.c.o
[ 57%] Building C object third_party/rabbitmq-c/librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl.c.o
[ 60%] Building C object third_party/rabbitmq-c/librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_hostname_validation.c.o
[ 62%] Building C object third_party/rabbitmq-c/librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_hostcheck.c.o
[ 64%] Building C object third_party/rabbitmq-c/librabbitmq/CMakeFiles/rabbitmq-static.dir/amqp_openssl_bio.c.o
[ 66%] Linking C static library librabbitmq.a
[ 66%] Built target rabbitmq-static它能够生成librabbitmq.a,,所以它能够静态构建。
我试过使用https://github.com/alanxz/rabbitmq-c/releases/tag/v0.10.0,这是最新的稳定版本。但还是同样的错误。
我试着搜索这个问题,但找不到任何有用的东西。
我几乎是新手,你能告诉我我做错了什么吗?还是我错过了什么?
发布于 2020-03-21 15:55:57
rabbitmq-c存储库在rabbitmq-c/librabbitmq子目录中设置LIBRABBITMQ_INCLUDE_DIRS变量,然后使用PARENT_SCOPE设置它,因此它也可以在顶级rabbitmq-c目录中使用。参见代码这里
集合(LIBRABBITMQ_INCLUDE_DIRS ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${SOCKET_IMPL} ${MSINTTYPES_INCLUDE} )LIBRABBITMQ_INCLUDE_DIRS ${LIBRABBITMQ_INCLUDE_DIRS} PARENT_SCOPE
但是,当您通过rabbitmq-c在项目中通过add_subdirectory包含LIBRABBITMQ_INCLUDE_DIRS回购时,它会引入一个额外的作用域,并且LIBRABBITMQ_INCLUDE_DIRS变量在这个父-父范围中不可用。你必须要么:
rabbitmq-c存储库中(尽管这不是可伸缩的,而且可能不是您想要做的)。rabbitmq-c CMake文件以进一步扩展该变量的作用域。rabbitmq-c,并使用rabbitmq-c提供的CMake 查找模块或CMake配置文件(例如rabbitmq-c-config.cmake)来定位安装的软件。发布于 2021-11-25 11:08:16
晚会有点晚了,我今天无意中遇到了同样的问题。
Kevin提出的3种解决方案都不适合我的需要(库被声明为子模块,因此我无法修改它,也不会在生产机器上安装)
我的解决方案是将rabbitmq包含目录添加到链接lib的目标:
target_include_directories("${PROJECT_NAME}" PUBLIC include/ path/to/rabbitmq-c/librabbitmq)https://stackoverflow.com/questions/60789200
复制相似问题