Почему в моем <package>-config.cmake есть <package>_include_dir и <package>_librairies пустые - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь сделать кроссплатформенный CMake для моего проекта (Windows и Linux). Мне нужно использовать внешние библиотеки (yaml- cpp). На Linux мне просто нужно было получить и использовать find_package. Но на Windows мне нужно добавить CMAKE_MODULE_PATH, чтобы моя программа нашла yaml-cpp-config.cmake.

Итак, я начинаю с установки yaml- cpp (https://github.com/jbeder/yaml-cpp) с CMake GUI 3.16 и mingw32 (mingw32-make install).

Я попробовал библиотеку в проекте 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_DIR и YAML_CPP_LIBRARIES пусты, и даже если CMake обнаружил yaml-cpp-config.cmake, он не работает. Так чего же мне не хватает при установке yaml- cpp? Должен ли я установить пути вручную?

1 Ответ

2 голосов
/ 24 января 2020

Отсутствие определения переменных YAML_CPP_INCLUDE_DIR и YAML_CPP_LIBRARIES является проблемой в проекте yaml- cpp, о котором уже сообщается здесь .

Вместо переменных, описанных в этот файл конфигурации, используйте цель 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 «современный путь».

...