Ошибка пути к файлу в Meson и Eigen - PullRequest
0 голосов
/ 12 июня 2018

Я не могу заставить локальные пути включения работать в системе сборки Meson.

Это включение C ++ работает правильно:

#include </cygdrive/c/Users/user/project/Third-Party/eigen/Eigen/Dense>

Это не работает:

#include "Third-Party/eigen/Eigen/Dense"

фатальная ошибка: Eigen / Dense: нет такого файла или каталога

В файле сборки Meson я попытался добавить путь Eigen без успеха:

# '.' 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 Ответ

0 голосов
/ 28 июня 2018

Для управления зависимостями, meson позволяет вам вручную объявить include_directories() в ваших файлах сборки.Однако есть другой способ обработки зависимостей: использование команды dependency().

dependency() - намного лучший способ обработки зависимостей, потому что meson создаст его при необходимости (если зависимость является разделяемой или статической библиотекой), а безопасно позволяет использовать include.Это означает, что вам не нужно знать, где физически находятся включения для зависимости, или заботиться об их путях.Единственным недостатком является то, что для такого рода зависимостей нужен собственный файл meson.build.

Использование команды dependency():

Чтобы использовать ее на самом деле, вам нужно написать файл переноса для зависимости.Или, если вам повезет, для вас уже есть файл переноса в Wrap DB - управляемой сообществом базе данных для файлов переноса мезонов.Wrap file - это некая конфигурация, которая объявляет, где вы можете получить зависимость и в какой форме.Файл обтекания можно обернуть вокруг zip-архивов и репозиториев git.

Для вашей зависимости есть файл обтекания в БД Wrap: 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

Сейчас не каждый проект строится с мезонами.Для тех, кто этого не делает, также укажите файл patch .Патч используется для простого копирования соответствующего файла meson.build в каталог зависимостей (а также любых других файлов, которые понадобятся для построения этой конкретной зависимости с помощью мезона).Файл Eigen Wrap содержит патч.

Чтобы узнать, как любая конкретная зависимость объявляет самой зависимостью (используя команду declare_dependency()), вам нужно исследовать файл meson.build в каталоге источника зависимости(хотя это часто просто имя зависимости плюс _dep , например, "eigen_dep").Для меня каталог eigen был 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 для разработки, то meson использует fallback : первый элемент в резерве - это базовое имя файла переноса, второй - имя объявленной зависимости.

Затем используйте переменную 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')
...
...