使用 rabbitmq-c 作为静态库会报错:致命错误:amqp.h: No such file or directory

Posted

技术标签:

【中文标题】使用 rabbitmq-c 作为静态库会报错:致命错误:amqp.h: No such file or directory【英文标题】:Using rabbitmq-c as static library gives error: fatal error: amqp.h: No such file or directory 【发布时间】:2020-03-21 14:46:25 【问题描述】:

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

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

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

    第三方目录中克隆https://github.com/alanxz/rabbitmq-c。 在我的源目录中,我正在使用 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)


    我运行 cmake .. -DBUILD_EXAMPLES=OFF -DBUILD_SHARED_LIBS=OFF(运行没有任何问题)。 但是当我执行 ma​​ke 时,出现以下错误:
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 response

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 的新手,你能告诉我我做错了什么还是我错过了什么?

【问题讨论】:

你能列出CMake变量$LIBRABBITMQ_INCLUDE_DIRS的内容吗?这个变量包含什么?您可以使用message($LIBRABBITMQ_INCLUDE_DIRS) 将其内容打印到屏幕上。 @squareskittles 奇怪的是这是空的 【参考方案1】:

rabbitmq-c 存储库在rabbitmq-c/librabbitmq 子目录中设置LIBRABBITMQ_INCLUDE_DIRS 变量,然后还使用PARENT_SCOPE 设置它,因此它也可以在***rabbitmq-c 目录中使用。查看代码here:

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)

但是,当您通过add_subdirectory 在项目中包含rabbitmq-c 存储库时,它会引入一个附加 作用域,而LIBRABBITMQ_INCLUDE_DIRS 变量在此父-父作用域中不可用。您必须:

    重新组织您的 CMake 项目,使您的项目位于 rabbitmq-c 存储库(尽管这不可扩展,并且可能不是您想要做的)。 修改***rabbitmq-c CMake 文件以进一步扩展此变量的范围。 在您的机器上安装 rabbitmq-c,并使用 CMake Find Module 或 CMake 配置文件(例如 rabbitmq-c-config.cmake) 由rabbitmq-c 提供,用于定位已安装的软件。

【讨论】:

我已经在系统中安装了rabbitmq-c,它在/usr/local/lib/x86_64-linux-gnu/里面创建了librabbitmq.a并且包含目录是/usr/local/include/。我如何在我的 CMakeLists.txt 中使用这些【参考方案2】:

聚会有点晚了,我今天偶然发现了同样的问题。

Kevin 提出的 3 种解决方案都不适合我的需要(lib 被声明为子模块,因此我无法修改它,不会安装在生产机器上)

我的解决方案是将rabbitmq包含目录添加到链接lib的目标:

target_include_directories("$PROJECT_NAME" PUBLIC include/ path/to/rabbitmq-c/librabbitmq)

【讨论】:

以上是关于使用 rabbitmq-c 作为静态库会报错:致命错误:amqp.h: No such file or directory的主要内容,如果未能解决你的问题,请参考以下文章

linux php安装RabbitMq扩展

是否可以编写一个在函数范围内使用时会报错的宏?

使用 huggingface 库会报错:KeyError: 'logits'

Linux上静态库和动态库的编译和使用

Xcode中导入.a静态库后报错添加-force_load或-all_load

windows下rabbitmq-c编译(带openssl无需MinGW)