使用 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
(运行没有任何问题)。
但是当我执行 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 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的主要内容,如果未能解决你的问题,请参考以下文章
使用 huggingface 库会报错:KeyError: 'logits'