将 yaml-cpp 添加到现有项目时正确设置 CMake 变量

fra*_*ans 5 c++ cmake yaml-cpp

我已将yaml-cppgit 存储库添加为子模块,并使用add_subdirectory.

一切都很好,但我必须设置YAML_CPP_INCLUDE_DIRYAML_CPP_LIBRARIES手动将它们用于我自己的目标。

因为有一个文件yaml-cpp-config.cmake(在 build 文件夹中生成)设置了这些变量,所以我试图只包含它:

include("${CMAKE_BINARY_DIR}/yaml-cpp/yaml-cpp-config.cmake")
Run Code Online (Sandbox Code Playgroud)

但后来我得到:

CMake Error at /bla/bla/build/yaml-cpp/yaml-cpp-config.cmake:11 (include):
  The file

/bla/bla/aml-cpp/yaml-cpp-targets.cmake

  was generated by the export() command.  It may not be used as the argument
  to the include() command.  Use ALIAS targets instead to refer to targets by
  alternative names.
Run Code Online (Sandbox Code Playgroud)

我真的不明白这个消息。如何在yaml-cpp不设置硬编码变量的情况下为我的目标提供包含目录和库?

我不是在寻找一种方法来正确地保存 include()文件,以防它不必完成。我只是有兴趣我怎么应该提供给我的目标所需的信息。

不幸的是,yaml-cpp似乎没有使用target_include_directories()which 会在需要的地方自动设置包含目录。

Tsy*_*rev 5

描述export命令:

创建一个可能被外部项目包含的文件 <filename>以从当前项目的构建树中导入目标。

请注意“外部”一词:这就是为什么您在尝试包含来自发出命令的同一项目的文件时收到错误消息的原因export

使用yaml-cpp-config.cmake文件的正确方法是在项目yaml-cpp 之外构建。例如,您可以ExternalProject_Addexecute_processfor build结合使用yaml-cpp作为项目配置阶段的一部分,请在此处查看有关此方法的更多信息。

然后你可以将给定的文件包含到你的项目中find_package

find_package(yaml-cpp PATHS <yaml-cpp-build-dir>)
Run Code Online (Sandbox Code Playgroud)

请注意,这yaml-cpp-config.cmake二进制目录描述构建状态yaml-cpp项目。

如果你想从你的项目中安装库/可执行文件,你最好安装 yaml-cpp,并从其安装目录中包含相应的文件:

find_package(yaml-cpp PATHS <yaml-cpp-install-dir>)
Run Code Online (Sandbox Code Playgroud)