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

时间:2015-07-09 13:32:19

标签: c++ c autotools autoconf automake

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

.cpp

如何摆脱这些警告?

1 个答案:

答案 0 :(得分:1)

要删除该选项,只需在subdir-objects中添加Makefile.am选项,即可启用 subidr-objects 。 e.g:

  AUTOMAKE_OPTIONS = subdir-objects foreign

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

e.g。你的Makefile.am包含:

foo_SOURCES=foo.c bar/bar.c

然后构建期间生成的对象就像

foo.o bar/bar.o

使用subdir-objects时,您将改为

foo.o bar.o

多个上下文

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

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"构建foo.c(在根目录中)和" libfoobar",没有产生冲突:

$ 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