首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >介子和特征的文件路径问题

介子和特征的文件路径问题
EN

Stack Overflow用户
提问于 2018-06-12 10:52:40
回答 1查看 1.9K关注 0票数 3

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

此C++包含正确工作:

代码语言:javascript
复制
#include </cygdrive/c/Users/user/project/Third-Party/eigen/Eigen/Dense>

这一条没有:

代码语言:javascript
复制
#include "Third-Party/eigen/Eigen/Dense"

致命错误:特征/密度:没有这样的文件或目录

在Meson构建文件中,我试图添加Eigen的路径,但没有成功:

代码语言:javascript
复制
# '.' will refer to current build directory
include_dirs = include_directories('include', '.', '../project/Third-Party/eigen')

这是项目树结构:

代码语言:javascript
复制
project
   meson.build
   src
      meson.build
      example.h
      example.cpp
   Third-Party
      eigen  (headers only lib)
         Eigen

注意:对于CMake,我没有这个问题。

EN

回答 1

Stack Overflow用户

发布于 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。例如:

代码语言:javascript
复制
$ 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()命令:

代码语言:javascript
复制
$ grep declare_dependency subprojects/eigen-eigen-5a0156e40feb/meson.build
eigen_dep = declare_dependency(

如您所见,特征声明依赖为eigen_dep。如果您想知道声明了什么,只需向下滚动依赖项meson.build文件即可。

现在,要在项目中使用该eigen_dep,请使用dependency()命令创建一个依赖对象。下面是我用来从艾根:开始吧编译“一个简单的第一个程序”的一个示例项目

代码语言:javascript
复制
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中,您可以编写:

代码语言:javascript
复制
# 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更改为:

代码语言:javascript
复制
# File: project/src/meson.build
eigen_includes = include_directories('../Third-Parties/eigen')
...
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50815424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档