Autotools 抱怨使用不同上下文编译的文件

Autotools complain about files compiled with different contexts

我开始收到这些警告(有好几页)。问题是我无法打开 subdir-objects,因为这些文件是从不同的上下文(针对不同的二进制文件)编译的,因此每个 .c/[=14= 生成多个 .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

如何摆脱这些警告?

要删除该选项,只需将 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