cpprestsdk, использующий vcpkg, cmake - не может найти включаемые файлы - PullRequest
2 голосов
/ 29 апреля 2019

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

$ 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 toolchain в 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, но почему созданный cmake Makefile не имеет всего необходимого для сборки? Нужно ли каким-либо образом вручную включать каждый пакет в vcpkg в файл CMakeLists.txt?

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

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

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

набор (cpprestsdk_DIR "/ vcpkg / установленный / x64-linux / share / cpprestsdk")

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

0 голосов
/ 30 апреля 2019

https://github.com/Microsoft/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}
  )

и https://github.com/Microsoft/cpprestsdk/blob/9d8f544001cb74544de6dc8c565592f7e2626d6e/Release/CMakeLists.txt#L22

set(CPPREST_EXPORT_DIR cpprestsdk CACHE STRING "Directory to install CMake config files.")

Одна вещь меня озадачивает (пока не эксперт 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 выполняет свои функции ...

...