我的源代码中包含了一个简单的预编译静态库(来自硬件供应商--因此没有源代码),需要链接到我的构建中。我曾希望它会像这样简单:
lib_foo = files('lib_foo.a')
...
foobar = static_library(..., link_with: lib_foo)但是我得到一个错误,说foo不是一个目标。我尝试了几十种不同的东西,试图成功地链接,我得到的最接近的是这个(使用meson 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,那么它就会死于“找不到”,尽管它再次出现在正确的位置。
我还没弄清楚为什么它有时会找到文件,有时又找不到,不管怎么说,这似乎是个死胡同。有人有什么建议吗?
发布于 2021-06-14 06:24:56
通常在子项目中使用declare dependency执行此操作,但您希望使用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是一样的,但是没有包装。当使用介子时,通常认为将像这样的外部库包装器放在子项目中是很好的风格。
发布于 2021-06-11 01:06:56
我找到了一个解决方案。它不是最优的,但它似乎工作得很好:
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')但这就够了。
https://stackoverflow.com/questions/67925406
复制相似问题