我不能使本地包含路径在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,我没有这个问题。
发布于 2018-06-28 20:50:21
对于依赖关系管理,meson允许您在构建文件中手动声明include_directories()。但是,还有一种处理依赖关系的方法:使用dependency()命令。
dependency()是处理依赖关系的一种更好的方法,因为如果需要的话,介子将构建它(如果依赖关系是一个共享的或静态的库),并且安全地允许您使用包含。这意味着,您不需要知道包含在哪里,因为依赖在物理上被定位,或者永远关心他们的路径。唯一的缺点是这种依赖需要它自己的meson.build文件。
使用dependency()命令:
要实际使用它,您必须使用写一个包装文件作为依赖项。或者,如果你够幸运的话,包装DB中已经有一个包文件了--一个由社区驱动的介子包文件数据库。what文件是某种类型的配置,它声明在何处可以获得依赖项以及以何种形式获得依赖关系。Wrap文件可以环绕zip归档和git存储库。
对于给定的依赖项,wrap DB:本征中有Wrap文件。您所要做的就是下载它,并将其放在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文件复制到依赖目录(以及使用介子构建特定依赖关系所需的任何其他文件)。特征包装文件包含一个修补程序。
要了解任何特定的依赖项如何将自身声明为依赖项(使用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()命令创建一个依赖对象。下面是我用来从艾根:开始吧编译“一个简单的第一个程序”的一个示例项目
project('example', 'cpp')
eigen_dependency = dependency('eigen', fallback: ['eigen', 'eigen_dep'])
executable('example', 'example.cpp', dependencies: eigen_dependency) 注意dependency()命令的参数。第一个是介子正在寻找的全系统依赖关系。如果您的系统中没有安装用于开发的特征,则meson使用回退:回退中的第一项是包装文件的basename,第二项是声明的依赖项的名称。
然后在构建的任何内容中使用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')
...https://stackoverflow.com/questions/50815424
复制相似问题