对于依赖管理,介子允许您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')
...