介子:在声明之前使用库

Posted

技术标签:

【中文标题】介子:在声明之前使用库【英文标题】:meson: use library before declaring it 【发布时间】:2021-01-08 22:04:42 【问题描述】:

假设您的项目如下所示:

meson.build:

project('myproject', 'cpp')

subdir('a')
subdir('b')
subdir('c')

a/meson.build:

mylib_a = library('mylib.cpp')
executable('a', 'main.cpp', link_with : [mylib_a])

b/meson.build 和 c/meson.build 看起来很相似。

如果您想将“c”可执行文件链接到 mylib_a 或 mylib_b,您只需将它们添加到数组中即可。但是,如果您想将“a”可执行文件与 mylib_b 或 mylib_c 链接,则必须重新排序“subdir”命令才能执行此操作。如果您想将 'c' 与 'mylib_a' 和 'a' 与 'mylib_c' 联系起来,唯一的办法就是将“executable('a', 'main.cpp', link_with : [mylib_a])" 命令进入 meson.build 而不是 a/meson.build。这搞砸了目录结构。

有什么方法可以在不破坏我的目录结构的情况下将 'a' 与 mylib_c 和 'c' 与 mylib_a 链接?

更新: 介子作者说没有办法做到这一点,但他们很快就会添加一个: https://github.com/mesonbuild/meson/issues/8178

【问题讨论】:

【参考方案1】:

您可以尝试将所有可执行文件放在根 meson.build 文件的底部。在这种情况下,所有 mylib_a/b/c 变量都将可用。您还需要在每个子目录 meson.build 文件中创建 file_a/b/c 变量,例如

file_a = files('main.cpp')

并在对应的executable(...)中使用它们。

这可能满足您的需求,但我建议您改用subprojects 概念。

更新

如果您有许多子目录、库和可执行文件,为了避免混乱,您可以使用带有foreach 的循环:

libs = ['a', 'b', 'c']
lib_list = []
foreach l : libs
  lib_list += library(l, join_paths(l, 'mylib.cpp'))
endforeach

progs = ['a', 'b', 'c']
foreach p : progs
  exe = executable(p, join_paths(p, 'main.cpp'), link_with : lib_list)
endforeach

【讨论】:

我知道将可执行文件放在根 meson.build 文件的按钮中是可行的,但这并不是最整洁的方式,因为它会使上层目录变得混乱。 “混乱的上层目录”——这是什么意思? 我认为如果命令 "executable('a', 'main.cpp', link_with : [mylib_a])" 写入 root/a/meson.build 而不是 "executable( 'a', 'a/main.cpp', link_with : [a/mylib_a])”写在 root/meson.build 中。因为我不想在我的 root/meson.build 文件中有 50 个可执行(...)命令。 @Kryptomatrix 检查我的更新,当然您可以使用字典或数组数组来控制源文件、要链接的库等。请注意,您根本不需要子目录中的 meson.build @Kryptomatrix 将很快添加一个???然而这只是一个讨论,很可能没有任何行动就结束了...... :) 因为它已经发生了更明显的功能请求

以上是关于介子:在声明之前使用库的主要内容,如果未能解决你的问题,请参考以下文章

介子找不到静态库

介子不链接库

介子不链接共享库

CMAKE_INSTALL_PREFIX 的介子等价物是啥?

如何将文件名作为 C++ 编译参数传递以在介子构建中使用?

使用介子和忍者安装 DPDK