配置 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.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
【参考方案1】:
我不知道是否有办法避免为每个程序构建不同的目标文件,但 building an intermediate static library 可以产生相同的效果,然后链接 lpsdr
和 catch2
反对。
类似这样的:
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 -- make[1]: *** 没有将目标设为“全部”的规则。停止