在 meson-build 中包含预编译库的正确方法是什么?

What is the correct way to include a pre-compiled library in meson-build?

我的源代码中包含一个简单的预编译静态库(来自硬件供应商 -- 因此没有源代码),需要 linked 到我的构建中。我曾希望它会像这样简单:

lib_foo = files('lib_foo.a')
...
foobar = static_library(..., link_with: lib_foo)

但是我收到一条错误消息,指出 foo 不是目标。我已经尝试了很多变体来尝试成功 link,我得到的最接近的是这个(使用介子 v0.55.1)

cc = meson.get_compiler('c')
abs_src_dir = meson.source_root()
cur_src_dir = meson.current_source_dir()
src_here_dir = abs_src_dir / cur_src_dir

warning('Searching: '+src_here_dir)
dep_foo = cc.find_library('lib_foo.a', dirs:src_here_dir, required: true)
...
foobar = static_library(..., dependencies: dep_foo)

虽然我不能让这个确切的例子起作用,但我已经让它在我的构建中起作用了。然而,即使 src_here_dir 是相关库的确切路径(正如我的警告所证明的那样),它也经常因 'not found' 错误而失败。即使我可以让它工作,如果我随后尝试构建一个 RPM,它也会以 'not found' 死掉,尽管它再次在正确的位置查找。

我还没弄明白为什么它有时能找到文件,有时找不到。无论如何,这似乎是一条死胡同。有人有什么建议吗?

我找到了解决办法。它不是最佳的,但它似乎运行良好:

abs_foo_dir = meson.source_root()
rel_foo_dir = meson.current_source_dir()

path_foo = abs_foo_dir / rel_foo_dir / 'lib_foo.a'

dep_foo = declare_dependency(link_args: path_foo)
...
foobar = static_library(..., dependencies: dep_foo)

这只是将绝对库路径作为链接器标志注入,并且有效,但感觉很笨拙。我更喜欢以下内容:

cc = meson.get_compiler('c')
dep_foo = cc.declare_static_library('lib_foo.a')

不过暂时就这样了。

您通常在子项目中使用声明依赖项来执行此操作,但您想使用 find_library

cc = meson.get_compiler('c')

dep = declare_dependency(
  dependencies : cc.find_library('foo', dirs : [meson.current_source_dir()]),
  include_directories : include_directories('.'),
)

这与 documented here 基本相同,但没有换行。在使用 Meson 时,将这样的外部库包装器放在子项目中通常被认为是一种很好的风格。