c++ - 介子和本征的文件路径问题
问题描述
我无法使本地包含路径在 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 我没有这个问题。
解决方案
对于依赖管理,介子允许您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')
...
推荐阅读
- excel - ExecuteExcel4Macro ,有没有办法通过索引而不是 Application.ExecuteExcel4Macro 中的名称来引用工作表
- c# - 从下拉列表 Select2 中的多个值中获取选定值
- numpy - 在 python 中使用直接线性变换进行相机校准
- python - 使用 numpy 时出现错误,没有名为“matplotlib.pylot”的模块
- excel - VBA 中的参数不正确
- javascript - 打开 DrawerNavigation 时自动调用 API
- bash - (参数列表太长)使用 *cat* 打开大量文件时
- python - django allauth - get() 返回了多个用户——它返回了 2 个!在生产中
- python - 使用 Python 使用带有 Quectel EC25 的 Raspberry pi 自动回复 SMS
- php - cURL 错误 7:无法连接到“x.xx.xxx.xx”端口 9090:连接被拒绝