Ошибка пути к файлу в 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 у меня нет этой проблемы.

0

Решение

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

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

С помощью dependency() команда:

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

Для вашей зависимости есть файл переноса в Wrap DB: собственный. Все, что вам нужно сделать, это загрузить его и поместить в 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() команда. Вот пример проекта, который я использовал для компиляции «Простая первая программа» из Эйген: Начало работы:

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')
...
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]