【问题标题】:Configuring autotools to use the same object files to build two programs配置 autotools 以使用相同的目标文件来构建两个程序
【发布时间】: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

标签: automake catch2


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-15
    • 2019-11-06
    • 1970-01-01
    • 2021-01-11
    • 2020-06-29
    • 2022-10-07
    • 2010-12-15
    • 1970-01-01
    相关资源
    最近更新 更多