【问题标题】:Autotools complain about files compiled with different contextsAutotools 抱怨使用不同上下文编译的文件
【发布时间】:2015-07-09 13:32:19
【问题描述】:

我开始收到这些警告(其中有几页)。问题是我无法打开subdir-objects,因为这些文件是从不同的上下文(针对不同的二进制文件)编译的,因此每个.c/.cpp 文件都会生成多个.o 文件。

src/scheduler.meta/Makefile.am:15: warning: source file 'base/MiscHelpers.cpp' is in a subdirectory,
src/scheduler.meta/Makefile.am:15: but option 'subdir-objects' is disabled

如何消除这些警告?

【问题讨论】:

  • 不清楚为什么您不能让目标文件与其源文件存放在相同的目录中?如果每个源文件生成多个目标文件,您目前如何区分或隔离从同一源编译的目标文件?
  • @MikeKinghan 我不明白你在问什么。是的,一个源文件是从多个上下文编译的,产生多个目标文件。如果没有subdir-objects,文件将被放入编译它们的目录,而不是源文件的目录。这就是区分不同上下文的方式。
  • @MikeKinghan 如果我打开subdir-objects,目标文件将被覆盖,导致随后的make 调用出现编译错误。我必须在每次编译之前致电make clean
  • automake 不会通过为上下文添加前缀来自动创建唯一的文件名吗?例如foo-foo.olibfoo-foo.o

标签: c++ c autotools autoconf automake


【解决方案1】:

要摆脱该选项,只需将subdir-objects 选项添加到Makefile.am 即可启用subidr-objects。例如:

  AUTOMAKE_OPTIONS = subdir-objects foreign

这将创建二进制对象的文件系统层次结构。

例如你的 Makefile.am 包含:

foo_SOURCES=foo.c bar/bar.c

那么构建过程中生成的对象会是这样的

foo.o bar/bar.o

使用subdir-objects时,你会改为使用

foo.o bar.o

多个上下文

如果您想多次构建相同的源文件,您需要找到一种方法来确保二进制对象获得唯一的名称。 如果 automake 认为对象是用不同的标志编译的,它会自动执行此操作。 因此,您可以通过为所有上下文提供(虚拟)FLAGS 来欺骗它创建唯一的后缀

AUTOMAKE_OPTIONS = subdir-objects

bin_PROGRAMS=foo
foo_SOURCES=main.c foo.c bar/foo.c
# we need to override the *_CPPFLAGS (using the defaults) to get unique names
foo_CPPFLAGS=$(AM_CPPFLAGS)

lib_LTLIBRARIES=libfoobar.la
libfoobar_la_SOURCES=lib.c foo.c bar/foo.c
# alternatively we can override *_CFLAGS
libfoobar_la_CFLAGS=$(AM_CFLAGS)

这将为“foo”和“libfoobar”构建foo.c(在根目录中),而不会产生冲突:

$ ls -1 *.o */*.o
bar/foo-foo.o
bar/libfoobar_la-foo.o
foo-foo.o
foo-main.o
libfoobar_la-foo.o
libfoobar_la-lib.o

【讨论】:

  • 这绝对不是我所看到的,名称不是唯一的。见这里:github.com/CESNET/torque
  • @Let_Me_Be 在我筛选扭矩项目的 150MB 源代码之前,您能不能指出一个特定的 Makefile.am/... 需要子目录对象并且有多个编译给定文件的上下文?
  • 好吧,你可以运行make && make 看看错误出现在哪里。但主要部分是 resmomserver 使用由宏 PBS_MOM 区分的相同来源。
  • make 由于缺少 libpbscache 而失败,坦率地说,我不想为此安装 libpbscache。
  • @Let_Me_Be 如果我将pbs_server_CFLAGS = $(AM_CFLAGS)pbs_mom_CPPFLAGS = $(AM_CPPFLAGS) 添加到resp。 Makefile.ams,我得到了唯一的.o-files,正如我的回答中所述。
猜你喜欢
  • 2010-11-25
  • 2018-10-21
  • 2017-01-17
  • 2011-01-08
  • 2010-09-12
  • 2020-06-22
  • 2020-05-15
  • 1970-01-01
  • 2018-02-02
相关资源
最近更新 更多