【问题标题】:Why my <package>-config.cmake have <package>_include_dir and <package>_librairies empty为什么我的 <package>-config.cmake 有 <package>_include_dir 和 <package>_librairies 为空
【发布时间】:2020-01-24 09:20:44
【问题描述】:

我正在尝试为我的项目(Windows 和 Linux)制作一个跨平台的 CMake。 我需要使用外部库(yaml-cpp)。在 Linux 上,我只需要做一个 apt get 并使用 find_package。但在 Windows 上,我需要附加 CMAKE_MODULE_PATH 才能让我的程序找到 yaml-cpp-config.cmake

所以我首先使用 CMake GUI 3.16 和 mingw32 (mingw32-make install) 安装 yaml-cpp (https://github.com/jbeder/yaml-cpp)。

我已经在一个 hello world 项目中尝试了该库,它运行良好。

cmake_minimum_required(VERSION 3.1)

project (yaml_test)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

message (STATUS "Yaml-cpp include = $ENV{YAML_CPP_INCLUDE_DIR}")
message (STATUS "Yaml-cpp library = $ENV{YAML_CPP_LIBRARIES}")

include_directories ($ENV{YAML_CPP_INCLUDE_DIR})

add_executable(yaml_test main.cpp)

target_link_libraries(yaml_test $ENV{YAML_CPP_LIBRARIES})

但是现在,我想在我的项目中包含该库并使用find_package。但是yaml-cpp-config.cmake 看起来像这样:

# - Config file for the yaml-cpp package
# It defines the following variables
#  YAML_CPP_INCLUDE_DIR - include directory
#  YAML_CPP_LIBRARIES    - libraries to link against

# Compute paths
get_filename_component(YAML_CPP_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
set(YAML_CPP_INCLUDE_DIR "")

# Our library dependencies (contains definitions for IMPORTED targets)
include("${YAML_CPP_CMAKE_DIR}/yaml-cpp-targets.cmake")

# These are IMPORTED targets created by yaml-cpp-targets.cmake
set(YAML_CPP_LIBRARIES "")

YAML_CPP_INCLUDE_DIRYAML_CPP_LIBRARIES变量为空,即使CMake找到yaml-cpp-config.cmake,也不起作用。那么我在安装 yaml-cpp 时遗漏了什么?我应该手动设置路径吗?

【问题讨论】:

  • 注意,yaml-cpp-config.cmake 脚本顶部的描述指的是 CMake 变量 YAML_CPP_INCLUDE_DIRYAML_CPP_LIBRARIES,它们通过 ${XXX} 表示法访问。但是您使用符号$ENV{XXX},它适用于环境变量——完全不同的变量集。

标签: cmake yaml-cpp


【解决方案1】:

YAML_CPP_INCLUDE_DIRYAML_CPP_LIBRARIES 变量的定义缺失是 yaml-cpp 项目的问题,已经报告了 here

使用目标yaml-cpp 代替此配置文件中描述的变量:

add_executable(yaml_test main.cpp)
# This provides both include directories and libraries.
target_link_libraries(yaml_test yaml-cpp)

与 IMPORTED 目标(在本例中为 yaml-cpp)的链接称为 CMake“现代方式”。

【讨论】:

  • 好的,这对我来说似乎很神奇,但是通过在我的环境变量中添加 find_package(yaml-cpp PATHS $ENV{yaml-cpp_ROOT}) 和 yaml-cpp_ROOT,它就像你说的那样工作...... .
  • 其实 find_package 中不需要 PATHS $ENV{yaml-cpp_ROOT}。顺便谢谢你
猜你喜欢
  • 2022-01-07
  • 1970-01-01
  • 2014-04-01
  • 2019-12-16
  • 1970-01-01
  • 2019-06-09
  • 2018-09-04
  • 2020-03-26
  • 2020-06-10
相关资源
最近更新 更多