【发布时间】:2020-04-12 20:50:28
【问题描述】:
我有一个 C++ 项目,使用自动工具构建,Catch2 用于单元测试。 Catch2 的细节可能无关紧要:它只是我必须构建和运行的另一个程序。
我有 Makefile.am 这样设置(简化):
AUTOMAKE_OPTIONS = subdir-objects
check_PROGRAMS = catch2
bin_PROGRAMS = lpsdr
common_sources = applicationcontroller.cc flowgraph.cc [...]
lpsdr_SOURCES = $(common_sources) main.cc
catch2_SOURCES = $(common_sources) test.cc
这很有效,除了它将所有内容编译两次,为common_sources 中的每个内容创建lpsdr-applicationcontroller.o 和catch2-applicationcontroller.o,依此类推。
当然,这会使构建时间加倍。我更愿意将catch2 和lpsdr 与相同的目标文件链接起来:构建起来会更快,并且还可以确保我正在测试与正在运行的完全相同的编译代码。
有没有办法解决这个问题?
【问题讨论】:
-
简化 Makefile.am 可能会删除一些重要的细节。如果程序有不同的编译器标志,那么 Automake 将生成单独的对象,因为那是你所要求的。
-
@TomTromey 你是说如果标志相同,automake 不会那样做吗?该项目在 github 上,github.com/bitglue/lpsdr_software/blob/… 是我添加 check2 之前的 makefile。我从未推送过损坏的版本,但也许您可以猜测我是如何做到的。大多数情况下我只是添加了
catch2_CXXFLAGS = $(lpsdr_CXXFLAGS)等。 -
IIRC 它不会尝试检查标志是否相同,而只是依赖于每个“聚合”标志的存在与否。在你的情况下,你有
lpsdr_CXXFLAGS,这就足够了。如果您希望将其应用于所有对象,只需将其重命名为AM_CXXFLAGS