automake-1.16: Objects created both with libtool and without
8.3.9.2 Objects ‘created with both libtool and without’
.......................................................
Sometimes, the same source file is used both to build a libtool library
and to build another non-libtool target (be it a program or another
library).
Let’s consider the following ‘Makefile.am’.
bin_PROGRAMS = prog
prog_SOURCES = prog.c foo.c ...
lib_LTLIBRARIES = libfoo.la
libfoo_la_SOURCES = foo.c ...
(In this trivial case the issue could be avoided by linking ‘libfoo.la’
with ‘prog’ instead of listing ‘foo.c’ in ‘prog_SOURCES’. But let’s
assume we want to keep ‘prog’ and ‘libfoo.la’ separate.)
Technically, it means that we should build ‘foo.$(OBJEXT)’ for
‘prog’, and ‘foo.lo’ for ‘libfoo.la’. The problem is that in the course
of creating ‘foo.lo’, libtool may erase (or replace) ‘foo.$(OBJEXT)’,
and this cannot be avoided.
Therefore, when Automake detects this situation it will complain with
a message such as
object 'foo.$(OBJEXT)' created both with libtool and without
A workaround for this issue is to ensure that these two objects get
different basenames. As explained in ⇒Renamed Objects, this
happens automatically when per-target flags are used.
bin_PROGRAMS = prog
prog_SOURCES = prog.c foo.c ...
prog_CFLAGS = $(AM_CFLAGS)
lib_LTLIBRARIES = libfoo.la
libfoo_la_SOURCES = foo.c ...
Adding ‘prog_CFLAGS = $(AM_CFLAGS)’ is almost a no-op, because when the
‘prog_CFLAGS’ is defined, it is used instead of ‘AM_CFLAGS’. However as
a side effect it will cause ‘prog.c’ and ‘foo.c’ to be compiled as
‘prog-prog.$(OBJEXT)’ and ‘prog-foo.$(OBJEXT)’, which solves the issue.