Использование rabbitmq- c в качестве библиотеки stati c выдает ошибку: фатальная ошибка: amqp.h: такого файла или каталога нет - PullRequest
0 голосов
/ 21 марта 2020

Я пытаюсь собрать rabbitmq- c как библиотеку stati 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})


Я запускаю 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- stati c, ниже приведен ответ 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, который является последней стабильной версией. Но все та же ошибка.

Я попытался найти проблему, но не смог найти ничего полезного.

Я довольно новичок ie для cmake, Подскажите, пожалуйста, что Я делаю что-то не так или я что-то упустил?

1 Ответ

1 голос
/ 21 марта 2020

Репозиторий rabbitmq-c устанавливает переменную LIBRABBITMQ_INCLUDE_DIRS в подкаталоге rabbitmq-c/librabbitmq, а затем устанавливает ее, используя PARENT_SCOPE, поэтому она также доступна на верхнем уровне rabbitmq-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-c в свой проект через add_subdirectory, он вводит дополнительная область , а переменная LIBRABBITMQ_INCLUDE_DIRS недоступна в этой родительской области. Вам потребуется:

  1. Реорганизовать ваш проект CMake так, чтобы ваш проект находился в репозитории rabbitmq-c (хотя это не масштабируемое и, вероятно, не то, что вы хочу сделать).
  2. Измените файл CMake верхнего уровня rabbitmq-c, чтобы расширить область действия этой переменной.
  3. Установите rabbitmq-c на своем компьютере и используйте CMake Найдите модуль или файл конфигурации CMake (например, rabbitmq-c-config.cmake), предоставленный rabbitmq-c для поиска установленного программного обеспечения.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...