首页 > 解决方案 > 介子和本征的文件路径问题

问题描述

我无法使本地包含路径在 Meson 构建系统中工作。

此 C++ 包含工作正常:

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

这个没有:

#include "Third-Party/eigen/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 我没有这个问题。

标签: c++cmakeeigenmeson-build

解决方案


对于依赖管理,介子允许您include_directories()在构建文件中手动声明。但是,还有另一种处理依赖关系的方法:使用dependency()命令。

dependency()是处理依赖关系的更好方法,因为 meson 将在必要时构建它(如果依赖关系是共享库或静态库)并安全地允许您使用包含。这意味着您不必知道依赖项的物理位置或关心它们的路径。唯一的缺点是这种依赖需要它自己的meson.build文件。

使用dependency()命令:

要实际使用它,您必须为依赖关系编写一个包装文件。或者,如果您足够幸运,Wrap DB中已经有一个适合您的包装文件——一个用于介子包装文件的社区驱动数据库。包装文件是某种配置,它声明您可以在哪里获得依赖项以及以何种形式。包装文件可以包装 zip 档案和 git 存储库。

对于您给定的依赖项,Wrap DB 中有一个 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

现在,并不是每个项目都使用介子构建。对于那些不这样做的, wrap file 还指定一个patch。补丁用于将适当的meson.build文件复制到依赖目录(以及使用介子构建特定依赖所需的任何其他文件)。特征包装文件包含一个补丁。

要了解任何特定依赖项如何将自己声明为依赖项(使用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_dep. 如果您想知道究竟声明了什么,只需向下滚动依赖meson.build文件即可。

现在,要eigen_dep在您的项目中使用它,请使用命令创建一个依赖对象dependency()。这是我用来从Eigen 编译“一个简单的第一个程序”的示例项目:入门

project('example', 'cpp')
eigen_dependency = dependency('eigen', fallback: ['eigen', 'eigen_dep'])
executable('example', 'example.cpp', dependencies: eigen_dependency) 

注意dependency()命令的参数。第一个是介子正在寻找的系统范围的依赖性。如果您的系统中没有安装用于开发的特征,则介子使用fallback:fallback 中的第一项是包装文件的基本名称,第二项是声明的依赖项的名称。

然后eigen_dependency在您构建的任何内容中使用变量,将其传递给依赖项参数。

使用include_directories()命令:

如果您只想使用include_directories()命令包含来自外部目录(例如“第三方”目录)的一些文件,则该目录必须与meson.build您使用它的文件相关。

要使用手动声明的包含,您需要调用include_directories()命令来获取 include_directories 对象。将该对象传递给include_directories您构建的任何参数。

鉴于您的示例,我假设根meson.build文件是项目构建文件。然后在那个 rootmeson.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')
...

推荐阅读