【问题标题】:cpprestsdk using vcpkg, cmake - can't find include filescpprestsdk 使用 vcpkg、cmake - 找不到包含文件
【发布时间】:2024-10-08 06:55:02
【问题描述】:

我正在将一个 Windows 项目移植到使用 cpprestsdk 的 CentOS Linux。我在 Windows 上使用 vcpkg,我想我会使用 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 根目录下看到该包的违规头文件,但为什么 cmake 生成的 Makefile 没有构建所需的一切? vcpkg 下的每个包都必须以某种方式手动包含在 CMakeLists.txt 文件中吗?

【问题讨论】:

  • vcpkg 不会自动将包含目录添加到编译器,也不会自动链接您创建的每个可执行文件的库。相反,它会将目录添加到 CMake 环境中,find_package() 可以在其中找到配置文件或查找脚本。也就是说,find_package(cpprestsdk REQUIRED) 需要与 cpprestsdk 一起使用。 “所有这些文件确实存在于 vcpkg 根目录下” - 您的意思可能是 only cpprestsdk-config.cmake 文件存在。其他名称是遵循 CMake 约定的 CMake 配置文件的替代名称。
  • 我认为这是“vcpkg 集成安装”的重点——为 cmake 生成工具链文件?无论如何,“cpprestsdk-config.cmake”存在,但找不到,这是为什么呢?很多很好的信息,但没有关于解决方案的建议......
  • 嗯,我的意思是vcpkg提供的工具链文件的目的是调整CMake变量(和环境变量),所以find_package()应该可以工作。我不知道为什么它在您的情况下不起作用,并且同意,这看起来很奇怪。

标签: c++ cmake cpprest-sdk vcpkg


【解决方案1】:

我发现了问题。 Cpprestsdk 不注册/公开任何 cmake find_package() 配置模块。如果这样做,这将不是问题 - 生成的工具链文件将设置 cmake 所需的所有内容,以便生成包含在 MakeFile 中的路径。

我在 CMakeList.txt 文件中添加了以下行,然后 cmake 能够找到配置文件:

set(cpprestsdk_DIR "/vcpkg/installed/x64-linux/share/cpprestsdk")

恕我直言,必须硬编码找到 cpprestsdk 的路径,这真的很糟糕。我仍然有头文件路径问题,所以实际上还有更多错误/丢失。一旦我从 vcpkg/cmake 团队那里得到消息,我会更新这篇文章。

【讨论】:

  • 更新:至少从 2.10 开始,MS 已修复此问题,因此问题不再存在。
【解决方案2】:

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 是否正确执行其操作...

【讨论】:

  • 感谢您的帮助。看我的帖子。似乎 cpprestsdk 在它的 cmake 支持中被削弱了......