dependencies - 在 meson-build 中包含预编译库的正确方法是什么?
问题描述
我的源代码中包含一个简单的预编译静态库(来自硬件供应商——因此没有源代码),需要链接到我的构建中。我曾希望它会像这样简单:
lib_foo = files('lib_foo.a')
...
foobar = static_library(..., link_with: lib_foo)
但是我收到一个错误,说 foo 不是目标。我已经尝试了几十种变化来尝试成功链接,我得到的最接近的是这个(使用介子 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 是相关库的确切路径(正如我的警告所证明的那样),它通常会因“未找到”错误而失败。即使我可以让它工作,如果我然后尝试构建一个 RPM,那么它会以“未找到”而死,尽管它再次出现在正确的位置。
我还没有弄清楚为什么它有时会找到文件,有时却找不到。无论如何,这似乎是一个死胡同。有没有人有什么建议?
解决方案
您通常在子项目中使用声明依赖项来执行此操作,但您想使用find_library
cc = meson.get_compiler('c')
dep = declare_dependency(
dependencies : cc.find_library('foo', dirs : [meson.current_source_dir()]),
include_directories : include_directories('.'),
)
这基本上与此处记录的内容相同,但没有包装。在使用 Meson 时,通常认为将这样的外部库包装器放在子项目中是一种很好的方式。
推荐阅读
- python - 不能在逆矩阵函数(Python 3.6)上将序列乘以“浮点”
- angular - 在 Angular 5 中使用 SwitchMap 订阅
- database - 找出 Neo4j 中 2 个节点之间是否存在路径的最佳方法是什么?
- c# - 如何检查字符串的内容及其长度?
- python - 使用模态运算符的 Python 网络解码
- android - 如何在 Sketchware webview 应用程序上修复 net::ERR_UNKNOWN_URL_SCHEME?
- c# - 无法弄清楚如何根据两个数字返回三个值之一
- html - Bootstrap 4中心图像但文本左对齐
- kubernetes - Pods readiness check 运行后失败,为什么新的 Pod 没有启动?
- c# - 如何从 JArray 中选择元素的值