配置 autotools 以使用相同的目标文件来构建两个程序

Posted

技术标签:

【中文标题】配置 autotools 以使用相同的目标文件来构建两个程序【英文标题】:Configuring autotools to use the same object files to build two programs 【发布时间】: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.ocatch2-applicationcontroller.o,依此类推。

当然,这会使构建时间加倍。我更愿意将catch2lpsdr 与相同的目标文件链接起来:构建起来会更快,并且还可以确保我正在测试与正在运行的完全相同的编译代码。

有没有办法解决这个问题?

【问题讨论】:

简化 Makefile.am 可能会删除一些重要的细节。如果程序有不同的编译器标志,那么 Automake 将生成单独的对象,因为那是你所要求的。 @TomTromey 你是说如果标志相同,automake 不会那样做吗?该项目在 github 上,github.com/bitglue/lpsdr_software/blob/… 是我添加 check2 之前的 makefile。我从未推送过损坏的版本,但也许您可以猜测我是如何做到的。大多数情况下我只是添加了catch2_CXXFLAGS = $(lpsdr_CXXFLAGS)等。 IIRC 它不会尝试检查标志是否相同,而只是依赖于每个“聚合”标志的存在与否。在你的情况下,你有lpsdr_CXXFLAGS,这就足够了。如果您希望将其应用于所有对象,只需将其重命名为 AM_CXXFLAGS 【参考方案1】:

我不知道是否有办法避免为每个程序构建不同的目标文件,但 building an intermediate static library 可以产生相同的效果,然后链接 lpsdrcatch2 反对。

类似这样的:

AUTOMAKE_OPTIONS = subdir-objects

noinst_LIBRARIES = liblpsdr.a
check_PROGRAMS = catch2
bin_PROGRAMS = lpsdr

liblpsdr_a_SOURCES = applicationcontroller.cc dispatcher_sink.cc [...]

lpsdr_SOURCES = main.cc
lpsdr_LDADD = liblpsdr.a
catch2_SOURCES = test.cc
catch2_LDADD = liblpsdr.a

【讨论】:

以上是关于配置 autotools 以使用相同的目标文件来构建两个程序的主要内容,如果未能解决你的问题,请参考以下文章

重构构建系统以使用 Autotools

autotools:如何测试需要配置文件的程序?

GNU autotool:没有规则来制定目标

autotools -- make[1]: *** 没有将目标设为“全部”的规则。停止

autotools:强制 make 不重建配置/Makefile

linux中如何安装autotools系列工具