Libtool lentidão, construção dobro?
Pergunta
No meu projeto, os módulos são organizados em subdiretórios para arrumação.
Meu projeto hierarquia dir:
$ ls -R
.: configure.in Makefile.am Makefile.cvs src
./src: log Makefile.am main.cpp
./src/log: log.cpp Makefile.am
configure.in:
AC_INIT(configure.in)
AM_CONFIG_HEADER(config.h)
AM_INIT_AUTOMAKE(myapp, 0.1)
AC_LANG_CPLUSPLUS
AC_PROG_CXX
AM_PROG_LIBTOOL
AC_OUTPUT(Makefile src/Makefile src/log/Makefile)
Makefile.am:
AUTOMAKE_OPTIONS = foreign
SUBDIRS = src
Makefile.cvs:
default:
aclocal
libtoolize --force --copy
autoheader
automake --add-missing --copy
autoconf
src / Makefile.am
bin_PROGRAMS = myapp
myapp_SOURCES = main.cpp
SUBDIRS = log
myapp_LDADD = $(top_builddir)/src/log/liblog.la
src / log / Makefile.am:
INCLUDES = $(all_includes)
METASOURCES = AUTO
noinst_LTLIBRARIES = liblog.la
liblog_la_SOURCES = log.cpp
src / main.cpp: contém int main(){}
, src / log / LOG.CPP contém void f(){}
Invocando make
produz (editado por brevidade):
libtool --mode=compile g++ -MT log.lo -MD -MP -MF .deps/log.Tpo -c -o log.lo log.cpp
libtool: compile: g++ -MT log.lo -MD -MP -MF .deps/log.Tpo -c log.cpp -fPIC -DPIC -o .libs/log.o
libtool: compile: g++ -MT log.lo -MD -MP -MF .deps/log.Tpo -c log.cpp -o log.o >/dev/null 2>&1
mv -f .deps/log.Tpo .deps/log.Plo
libtool --mode=link g++ -o liblog.la log.lo
libtool: link: ar cru .libs/liblog.a .libs/log.o
libtool: link: ranlib .libs/liblog.a
libtool: link: ( cd ".libs" && rm -f "liblog.la" && ln -s "../liblog.la" "liblog.la" )
g++ -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.cpp
mv -f .deps/main.Tpo .deps/main.Po
libtool --mode=link g++ -o myapp main.o ../src/log/liblog.la
libtool: link: g++ -o myapp main.o ../src/log/.libs/liblog.a
O problema é as três primeiras linhas: LOG.CPP é compilado duas vezes
A pergunta:? por isso não é apenas compilado uma vez - tomando metade do tempo
Nota: Eu não tenho idéia do que estou fazendo - autotools é magia negra para mim, mas temos que usá-lo em nosso lugar. Os documentos são incompreensíveis para mim.
Solução
Por padrão Libtool cria dois tipos de bibliotecas: estático e compartilhada. (Aka libfoo.a e libfoo.so)
Estática e caco requerem diferentes sinalizadores de compilação. bibliotecas dinâmicas - objetos compartilhados uso Posição código independente com as seguintes bandeiras gcc:
-fPIC -DPIC
estática não são. Você pode forçar construir apenas um tipo de specifing
./configure --disable-shared
ou
./configure --disable-static
Justificação
Normalmente, quando biblioteca é fornecida para o usuário que fornecer em duas configurações - estática para o desenvolvimento que permite criar estática pura constrói e dinâmica para uso pela maioria de programas que usam esta biblioteca. Então, geralmente quando você instala biblioteca no sistema você só instalar o objeto compartilhado. (Aka libfoo_XYZ.deb)
Quando você adiciona versão de desenvolvimento (aka libfoo-dev_XYZ.deb) você adicionar cabeçalhos e estaticamente versão de compilação da biblioteca que permite aos usuários fazer staic constrói se whant.
Esta é uma prática comum para o transporte de bibliotecas em UNIX. Assim libtool faz isso para você automaticamente.