cpprestsdk с использованием vcpkg, cmake - не удается найти включаемые файлы

Я портирую проект Windows на CentOS Linux, который использует cpprestsdk. Я использую vcpkg в Windows, и я подумал, что буду использовать vcpkg (и cmake), чтобы вводить и создавать пакеты и «открывать» библиотеки и файлы заголовков для моего проекта. Последовательность не позволяет получить "известный" моему источнику файл заголовка пакета. Вот что я сделал.

$ vcpkg install boost cpprestsdk
$ vcpkg integrate install
Applied user-wide integration for this vcpkg root.
CMake projects should use: "-DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.cmake"

$ cd <source>
$ vi CMakeLists.txt
cmake_minimum_required(VERSION 2.8.9)
project(Domain)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11 -I../ ")
file(GLOB SOURCES "*.cpp")

#Generate the shared library from the sources
add_library(Domain SHARED ${SOURCES})

install(TARGETS Domain DESTINATION ../lib)

$ cmake -DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.cmake -G "Unix Makefiles" .
$ make
[  7%] Building CXX object CMakeFiles/Domain.dir/BaseDataFactory.cpp.o
In file included from /src/Domain/stdafx.h:4:0,
             from /src/Domain/BaseDataFactory.cpp:1:
../Common/Common.h:75:26: fatal error: cpprest/json.h: No such file or directory
#include <cpprest/json.h>

Добавив параметр файла цепочки инструментов vcpkg в cmake, я подумал, что он должен позаботиться о раскрытии всех путей пакетов (lib / header) и записать их в выходной файл Makefile?

Я пробовал добавить

find_package(cpprestsdk REQUIRED)

Потом я получил кучу новых ошибок:

CMake Error at CMakeLists.txt:7 (find_package):
Could not find a package configuration file provided by "cpprestsdk" with
any of the following names:

cpprestsdkConfig.cmake
cpprestsdk-config.cmake
cpprestConfig.cmake
cpprest-config.cmake

cpprestsdk-config.cmake существует в корневом каталоге vcpkg, и я определенно могу видеть вызывающий ошибку файл заголовка для пакета в корневом каталоге vcpkg, но почему в Makefile, созданном cmake, нет всего, что нужно для создания? Нужно ли каким-либо образом вручную включать каждый пакет в vcpkg в файл CMakeLists.txt?


person cardinalPilot    schedule 29.04.2019    source источник
comment
vcpkg не автоматически добавляет каталоги включения в компилятор и не связывает автоматически библиотеки для каждого исполняемого файла, который вы создаете. Вместо этого он добавляет в среду CMake каталоги, в которых файлы конфигурации или сценарии поиска можно найти с помощью find_package(). То есть find_package(cpprestsdk REQUIRED) необходимо для работы с cpprestsdk. Все эти файлы существуют в корневом каталоге vcpkg - возможно, вы имеете в виду, что существует только cpprestsdk-config.cmake файл. Другие имена являются альтернативными именами для файла конфигурации CMake, который следует соглашениям CMake.   -  person Tsyvarev    schedule 29.04.2019
comment
‹Отредактировано в соответствии с вашим комментарием› Я думал, что это была цель 'vcpkg integration install' - создать файл инструментальной цепочки для cmake? В любом случае cpprestsdk-config.cmake существует, но не может быть найден, почему? Много хорошей информации, но нет предложений по решению ...   -  person cardinalPilot    schedule 29.04.2019
comment
Хм, я имел в виду, что целью файла цепочки инструментов, предоставляемого vcpkg, является настройка переменных CMake (и переменных среды), поэтому find_package() должен работать. Я не знаю, почему это не работает в вашем случае, и согласен, что это выглядит странно.   -  person Tsyvarev    schedule 29.04.2019


Ответы (2)


Я нашел проблему. Cpprestsdk не регистрирует и не предоставляет какой-либо модуль конфигурации cmake find_package (). Если бы это было так, это не было бы проблемой - сгенерированный файл инструментальной цепочки установил бы все, что нужно cmake, чтобы сгенерировать пути для включения в MakeFile.

Я добавил следующую строку в файл CMakeList.txt, и cmake смог найти файл конфигурации:

установить (cpprestsdk_DIR "/ vcpkg / installed / x64-linux / share / cpprestsdk")

Что действительно, очень плохо, ИМХО, нужно жестко закодировать путь для поиска cpprestsdk. У меня все еще есть проблема с путем к файлу заголовка, так что на самом деле гораздо больше идет не так / отсутствует. Я обновлю этот пост, как только получу известие от команд vcpkg / cmake.

person cardinalPilot    schedule 30.04.2019
comment
Обновление: по крайней мере, с 2.10, MS исправила это, поэтому проблема больше не существует. - person cardinalPilot; 31.01.2021

cpprestsdk / blob / ea4eff7cd1d6110833df869f7591f266816f8328 / Release / src / CMakeLists.txt # L282-L285

install(
    FILES "${CMAKE_CURRENT_BINARY_DIR}/cpprestsdk-config.cmake"
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/${CPPREST_EXPORT_DIR}
  )

и

Одна вещь меня озадачивает (пока я не эксперт по vcpkg) https://github.com/Microsoft/vcpkg/blob/master/ports/cpprestsdk/portfile.cmake#L45

vcpkg_fixup_cmake_targets(CONFIG_PATH lib/share/cpprestsdk)

при этом должно быть lib/cpprestsdk ИМХО (ред: не проверена версия SHA1)

@cardinalPilot, вы пытались найти файл конфигурации в своей системе? Можете ли вы также попробовать распечатать CMAKE_PREFIX_PATH и т. д., чтобы увидеть, правильно ли vcpkg делает свои вещи ...

person Mizux    schedule 30.04.2019
comment
Спасибо за помощь. Смотрите мой пост. Похоже, cpprestsdk не работает в поддержке cmake ... - person cardinalPilot; 30.04.2019