首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在meson-build中包含预编译库的正确方法是什么?

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

Stack Overflow用户
提问于 2021-06-11 00:48:54
回答 2查看 98关注 0票数 0

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

代码语言:javascript
复制
lib_foo = files('lib_foo.a')
...
foobar = static_library(..., link_with: lib_foo)

但是我得到一个错误,说foo不是一个目标。我尝试了几十种不同的东西,试图成功地链接,我得到的最接近的是这个(使用meson v0.55.1)

代码语言:javascript
复制
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,那么它就会死于“找不到”,尽管它再次出现在正确的位置。

我还没弄清楚为什么它有时会找到文件,有时又找不到,不管怎么说,这似乎是个死胡同。有人有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-14 06:24:56

通常在子项目中使用declare dependency执行此操作,但您希望使用find_library

代码语言:javascript
复制
cc = meson.get_compiler('c')

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

这基本上和documented here是一样的,但是没有包装。当使用介子时,通常认为将像这样的外部库包装器放在子项目中是很好的风格。

票数 1
EN

Stack Overflow用户

发布于 2021-06-11 01:06:56

我找到了一个解决方案。它不是最优的,但它似乎工作得很好:

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

这只是将绝对库路径作为链接器标志注入,这是可行的,但感觉很笨拙。我更喜欢类似这样的东西:

代码语言:javascript
复制
cc = meson.get_compiler('c')
dep_foo = cc.declare_static_library('lib_foo.a')

但这就够了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67925406

复制
相关文章

相似问题

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