首页 > 解决方案 > 使用 rabbitmq-c 作为静态库会报错:致命错误:amqp.h: No such file or directory

问题描述

我正在尝试将rabbitmq-c构建为静态库,以便可以在 AWS lambda 中使用。

我能够按照文档构建示例,并且这些示例运行良好。

但现在我正试图在我自己的项目中使用。以下是我采取的步骤:

  1. 第三方目录中克隆https://github.com/alanxz/rabbitmq-c 。
  2. 在我的源目录中,我正在使用 cmake 构建。

下面是我的 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})


  1. 我运行cmake .. -DBUILD_EXAMPLES=OFF -DBUILD_SHARED_LIBS=OFF(没有任何问题)。
  2. 但是当我执行make时,它​​会给出以下错误:
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>

我能够构建rabbitmq-static,下面是make响应

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 。但仍然是同样的错误。

我尝试搜索有关该问题的信息,但找不到任何有用的信息。

我是cmake的新手,你能告诉我我做错了什么还是我错过了什么?

标签: c++cmakerabbitmq-c

解决方案


存储库在子目录中rabbitmq-c设置LIBRABBITMQ_INCLUDE_DIRS变量,然后也设置它使用,因此它也可以在顶级目录中使用。在此处查看该代码:rabbitmq-c/librabbitmqPARENT_SCOPErabbitmq-c

set(LIBRABBITMQ_INCLUDE_DIRS
    ${CMAKE_CURRENT_BINARY_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}
    ${SOCKET_IMPL}
    ${MSINTTYPES_INCLUDE}
    )

include_directories(${LIBRABBITMQ_INCLUDE_DIRS})

set(LIBRABBITMQ_INCLUDE_DIRS
    ${LIBRABBITMQ_INCLUDE_DIRS}
    PARENT_SCOPE)

但是,当您通过 将rabbitmq-crepo 包含在项目中时add_subdirectory,它会引入一个额外的范围,并且该LIBRABBITMQ_INCLUDE_DIRS变量在此父-父范围中不可用。您将不得不:

  1. 重新组织您的 CMake 项目,使您的项目位于 存储rabbitmq-c中(尽管这不可扩展,并且可能不是您想要做的)。
  2. 修改顶级rabbitmq-c CMake 文件以进一步扩展此变量的范围。
  3. 安装 rabbitmq-c在您的机器上,并使用 CMake查找模块 或提供的 CMake 配置文件(例如rabbitmq-c-config.cmakerabbitmq-c来定位已安装的软件。

推荐阅读