Ошибка пути к файлу в Meson и Eigen
Я не могу заставить локальные пути включения работать в системе сборки Meson.
Это включение C++ работает правильно:
#include </cygdrive/c/Users/user/project/Third-Party/eigen/Eigen/Dense>
Этот не:
#include "Third-Party/eigen/Eigen/Dense"
фатальная ошибка: Eigen/Dense: нет такого файла или каталога
В файле сборки Meson я безуспешно пытался добавить путь Эйгена:
# '.' will refer to current build directory
include_dirs = include_directories('include', '.', '../project/Third-Party/eigen')
Это древовидная структура проекта:
project
meson.build
src
meson.build
example.h
example.cpp
Third-Party
eigen (headers only lib)
Eigen
Примечание: с CMake у меня нет этой проблемы.
1 ответ
Для управления зависимостями, мезон позволяет вам вручную объявить include_directories()
в ваших файлах сборки. Однако есть еще один способ обработки зависимостей: использование dependency()
команда.
dependency()
это гораздо лучший способ обработки зависимостей, потому что meson создаст его при необходимости (если зависимость является разделяемой или статической библиотекой) и безопасно позволяет использовать include. Это означает, что вам не нужно знать, где физически находятся включения для зависимости, или заботиться об их путях. Единственным недостатком является то, что этот вид зависимости нуждается в своем собственном meson.build
файл.
С помощью dependency()
команда:
Чтобы на самом деле использовать его, вы должны написать файл переноса для зависимости. Или, если вам повезет, в Wrap DB для вас уже есть файл переноса - управляемая сообществом база данных для файлов переноса мезонов. Wrap file - это некая конфигурация, которая объявляет, где вы можете получить зависимость и в какой форме. Wrap file может обтекать zip-архивы и git-репозитории.
Для данной зависимости в Wrap DB есть файл переноса: eigen. Все, что вам нужно сделать, это загрузить его и поместить в subprojects
каталог рядом с вашим meson.build
, Например:
$ cd project
$ mkdir subprojects
$ wget "https://wrapdb.mesonbuild.com/v1/projects/eigen/3.3.4/1/get_wrap" \
-O subprojects/eigen.wrap
Сейчас не каждый проект строится с мезонами. Для тех, кто этого не делает, оберните файл также укажите патч. Патч используется только для копирования соответствующих meson.build
файл в каталог зависимостей (а также любые другие файлы, которые понадобятся для построения этой конкретной зависимости с помощью meson). Файл Eigen Wrap содержит патч.
Чтобы выяснить, как любая конкретная зависимость объявляет себя зависимостью (используя declare_dependency()
команда), вам нужно исследовать meson.build
файл в каталоге источника зависимостей (хотя часто это просто имя зависимости плюс _dep, например, "eigen_dep"). Для меня собственный каталог был subprojects/eigen-eigen-5a0156e40feb
, Итак, вы ищете declare_dependency()
команда:
$ grep declare_dependency subprojects/eigen-eigen-5a0156e40feb/meson.build
eigen_dep = declare_dependency(
Как видите, eigen объявляет зависимость как eigen_dep
, Если вы хотите знать, что именно объявлено, просто прокрутите вниз зависимость meson.build
файл.
Теперь, чтобы использовать это eigen_dep
в вашем проекте создайте объект зависимости с dependency()
команда. Вот пример проекта, который я использовал для компиляции "Простая первая программа" из Eigen: Getting Started:
project('example', 'cpp')
eigen_dependency = dependency('eigen', fallback: ['eigen', 'eigen_dep'])
executable('example', 'example.cpp', dependencies: eigen_dependency)
Обратите внимание на аргументы для dependency()
команда. Первая - это общесистемная зависимость, которую ищет мезон. Если в вашей системе не установлено собственное приложение для разработки, то мезон использует отступление: первый элемент в резерве - это базовое имя файла переноса, второй - имя объявленной зависимости.
Тогда используйте eigen_dependency
переменная во всем, что вы строите, передавая ее в аргумент зависимости.
С помощью include_directories()
команда:
Если вы хотите просто включить некоторые файлы из внешнего каталога (например, из своего каталога "Сторонний"), используя include_directories()
команда, этот каталог должен быть относительно meson.build
файл, где вы используете его.
Чтобы использовать заявленные вручную, необходимо позвонить include_directories()
команда для получения объекта include_directories. Передать этот объект include_directories
аргумент в том, что вы строите.
Учитывая ваш пример, я предполагаю, что корень meson.build
файл является файлом сборки проекта. Тогда в этом корне meson.build
Например, вы можете написать:
# File: project/meson.build
project('example', 'cpp')
eigen_includes = include_directories('Third-Parties/eigen')
executable('example', 'example.cpp', include_directories: eigen_includes)
Но если вы хотите получить собственные включает в себя от src/meson.build
тогда вам нужно поменять include_directories
чтобы:
# File: project/src/meson.build
eigen_includes = include_directories('../Third-Parties/eigen')
...