在 Linux 中,我在 Gnome Builder (3.26.4) 中使用 Meson (0.44.0) 作为将使用 Gee 和 GXml 的控制台程序。我的目的是在 Genie 中写这个。
当我在 Gnome Builder 中使用 Meson 时它会失败,但在使用 valac (0.38.8) 从命令行调用时同样会成功,如下所示:
valac --pkg=gtk+-3.0 --pkg=gee-0.8 --pkg=gxml-0.16 main.gs
上面没有错误。我尝试将 meson.build 与 gee 和 gxml 设置为 依赖项 或 vala_args 。同样的错误。
检查 pkg-config,我得到以下信息:
$ pkg-config --libs gxml-0.16
-L/usr/local/lib64 -lgxml-0.16 -lgio-2.0 -lxml2 -lgee-0.8 -lgobject-2.0 -lglib-2.0
$ pkg-config --libs gee-0.8
-lgee-0.8 -lgobject-2.0 -lglib-2.0
$ pkg-config --libs gee-1.0
-lgee -lgobject-2.0 -lglib-2.0
也许我做错了什么。这是本地 meson.build 文件,后跟顶级 meson.build 和错误:
example_sources = [
'main.gs'
]
example_deps = [
dependency('gio-2.0', version: '>= 2.50'),
dependency('gtk+-3.0', version: '>= 3.22'),
dependency('glib-2.0', version: '>= 2.50')
]
gnome = import('gnome')
example_sources += gnome.compile_resources(
'example-resources',
'example.gresource.xml',
c_name: 'example'
)
executable(
'example',
example_sources,
vala_args: '--target-glib=2.50 --pkg=gee-0.8 --pkg=gxml-0.16',
dependencies: example_deps,
install: true
)
使用顶级 meson.build:
project(
'example',
['c', 'vala'],
version: '0.1.0',
meson_version: '>= 0.40.0',
)
subdir('src')
错误是:
uses Gee
error: The namespace name 'Gee' could not be found
我正在从 Gnome-Builder 中调用构建。有人可以帮助我了解发生了什么吗?我试图找出为什么 valac 成功而 meson 在文档中失败但找不到解决方案。
最佳答案
Gee 和 GXml 应该是依赖关系,就像 GIO、GLib 和 GTK+。所以你应该尝试:
example_deps = [
dependency('gio-2.0', version: '>= 2.50'),
dependency('gtk+-3.0', version: '>= 3.22'),
dependency('glib-2.0', version: '>= 2.50'),
dependency('gobject-2.0'),
dependency('gee-0.8'),
dependency('gxml-0.16'),
]
通常你不需要超越它。这使得
--pkg
中的 vala_flags
选项变得不必要。介子为您做到这一点。 Meson 的工作方式是使用 valac
生成 C 代码,然后在单独的阶段使用 C 编译器生成二进制文件。通过使用 --pkg
,您只是告诉 valac
要使用哪个 VAPI 文件,而不是通知 C 编译器将哪个 pkg-config
包用于 C 库。另请注意,我已添加
gobject-2.0
作为依赖项。如果我没记错的话,GNOME Builder 会错过它,它确实会影响构建。错误消息
error: The namespace name 'Gee' could not be found
令人不安。这是 Vala 编译器的错误,我原以为编译器能够使用您尝试过的 vala_args
方法找到 VAPI 文件。也许你有从源代码构建的 Gee 并且没有安装系统范围?Meson 确实允许添加另一个 VAPI 搜索目录:
add_project_arguments(['--vapidir',
join_paths(meson.current_source_dir(), 'vapi')
],
language: 'vala'
)
Meson Build 文档的 Vala page 有更多详细信息。
Meson 版本 0.42 中添加了 Genie 支持。所以
meson_version:
应该是 >= 0.42.0
。如果仍然存在问题,那么这里是使用 Genie、Gee 和 Meson 的 MCVE。这应该从命令行编译。将以下 Sprite 程序保存为
genie-gee.gs
:[indent=2]
uses Gee
init
var my_list = new ArrayList of string()
my_list.add( "one" )
my_list.add( "two" )
for item in my_list
print( item )
然后将以下介子文件保存为
meson.build
:project('minimal-genie-gee-example',
'vala', 'c'
)
genie_gee_deps = [
dependency('glib-2.0'),
dependency('gobject-2.0'),
dependency('gee-0.8'),
]
executable('genie-gee',
'genie-gee.gs',
dependencies: genie_gee_deps
)
从命令行使用 Meson 设置构建目录:
meson setup builddir
这应该显示已找到依赖项,例如:
Native dependency gee-0.8 found: YES 0.18.0
然后使用 Ninja build 构建项目:
ninja -C builddir
对于任何使用 Fedora 的人来说
ninja
就是 ninja-build
。Meson 设置构建目录的任何问题都会记录到
builddir/meson-logs/meson-log.txt
。如果这有效,但在 GNOME Builder 中失败,那么我唯一的想法是 GNOME Builder 是使用 Flatpak 安装的。 Flatpak 的沙盒环境可能会影响对依赖项的访问。
更新: 根据评论中的讨论,GNOME Builder 使用的运行时似乎是问题所在。 Builder 有一个很棒的功能,可以选择用于构建软件的 Flatpak 运行时。如果您通过在工作站上安装库和头文件来遵循“传统”开发方式,请确保选择 主机操作系统 而不是 Flatpak 运行时。看起来 GNOME Flatpak 运行时不包含 libgee。
更新 2: 当编写 Flatpak 构建器 list 并且依赖项不在 Flatpak 运行时/SDK 中时,然后将依赖项添加为 Flatpak 构建器 list 中的另一个模块。这允许 GNOME Builder 使用 Flatpak 来构建带有 Flatpak 运行时的软件。 AsymLabs answer 中给出了一个示例 list 。
关于vala - Flatpak Meson 没有从 Gnome Builder 中找到 Vala 库,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48880919/