从相同的代码库构建多个可执行文件
Posted
技术标签:
【中文标题】从相同的代码库构建多个可执行文件【英文标题】:Build multiple executables from same code base 【发布时间】:2019-06-19 21:32:05 【问题描述】:我正在尝试 Meson/Ninja
以完成我在 make
中所做的其他事情。我在src
变量中列出了源文件,其中一个是带有call ROUTINE
语句的程序prog.f90
,预处理器为不同的测试可执行文件1.x, 2.x...
插入名称,如sub1, sub2...
。像这样:
project('proj','fortran', version : '0')
flags = ['-cpp','-fmax-errors=3','-Wall','-fcheck=all','-fbacktrace','-Og', ...]
src = ['src/f1.f90', 'src/f2.f90', prog.f90, tools.f90, ...]
progs = [
['1.x', '-DROUTINE=sub1' ],
['2.x', '-DROUTINE=sub2' ],
['3.x', '-DROUTINE=sub3' ],
...
]
foreach p : progs
executable(p[0], src,fortran_args : flags + [p[1]])
endforeach
它比使用make
更快,但Meson/Ninja
在更改特定文件时设法使用所有内核大约 1 秒,而 make 需要 2 秒,但主要在 1 个内核上运行。
似乎每个可执行文件都有自己的构建目录,如build/1x@exe
等,所有.mod
和.o
文件都匹配src
。并且运行ninja -v
似乎更改的文件被编译的次数与可执行文件的次数一样多。同时 make 只编译它(但由于对象而不是模块之间的依赖关系,然后编译其他文件)。
那么更聪明的方法是什么?
【问题讨论】:
【参考方案1】:最简单的方法是首先从所有其他源文件(即所有非prog.f90
)创建static_library()
,然后将其添加到您的link_with
kwarg可执行文件。
这最终会是这样的:
# Note that 'prog.f90' is no longer in here
src = files('src/f1.f90', 'src/f2.f90', 'tools.f90', ...)
# This is the static library which will only get compiled once
lib = static_library(src, fortran_args: flags)
progs = [
['1.x', '-DROUTINE=sub1' ],
['2.x', '-DROUTINE=sub2' ],
['3.x', '-DROUTINE=sub3' ],
...
]
foreach p : progs
executable(p[0], 'prog.f90', fortran_args: flags + [p[1]], link_with: lib)
endforeach
【讨论】:
以上是关于从相同的代码库构建多个可执行文件的主要内容,如果未能解决你的问题,请参考以下文章