这是我的项目结构:
.
??? include
??? src
? ??? abc
? ? ??? include
? ? ??? src
? ??? def
? ? ??? include
? ? ??? src
? ??? ghi
? ??? include
? ??? src
??? vendor
??? bar
? ??? include
? ??? src
??? foo
16 directories
Run Code Online (Sandbox Code Playgroud)
我想将我的构建移植到 Meson。但是,我不确定如何链接兄弟文件夹中定义的目标。
我的依赖图如下所示:
src/abc/meson.build 定义一个静态库 abcsrc/def/meson.build定义了一个def依赖于abc和的静态库foosrc/ghi/meson.build定义一个ghi依赖于的静态库barvendor/bar/meson.build 定义一个静态库 barvendor/foo/meson.build 定义一个静态库 foomeson.build定义了一个app依赖于的可执行文件abc,def以及ghi在文档中,似乎有两种机制:
subdirsubproject我不清楚这里哪个最好。我的源代码之外没有任何依赖项。
我应该在我的meson.build文件中写什么来将这些目标链接在一起?
除了@sdgfsdh(正确)的答案之外,我喜欢的另一种方法是仅在顶级介子文件中定义库和可执行文件,并使用 subdir 调用来定义一组源文件和“本地”包含路径。通过这种方式,子目录文件不会隐式地相互依赖;整个依赖树位于顶级介子文件中。
这种方法的优点是:
缺点:
您的案例的一个例子:
# Top-level meson.build
subdir('src/abc')
subdir('src/def')
subdir('src/ghi')
subdir('vendor/foo')
subdir('vendor/bar')
libabc = static_library('abc', abc_files, include_directories: abc_includes)
libabc_dep = declare_dependency(include_directories: abc_includes, link_with : libabc)
libfoo = static_library('foo', foo_files, include_directories: foo_includes)
libfoo_dep = declare_dependency(include_directories: foo_includes, link_with : libfoo)
libdef = library('def', def_files, include_directories: def_includes, dependencies : [ libabc_dep, libfoo_dep])
Run Code Online (Sandbox Code Playgroud)
# src/abc/meson.build (others would be similar)
abc_files = files(['1.c','2.c',...])
abc_includes = include_directories('include')
Run Code Online (Sandbox Code Playgroud)
您可以subdir从顶级meson.build文件向下使用。您在子目录meson.build文件中声明的所有变量都可用于以后的meson.build文件。只要你的调用顺序subdir正确,它就会起作用。