Libtool Langsamkeit, Doppel Gebäude?
Frage
In meinem Projekt-Module werden in subdirs für tidiness organisiert.
Mein Projekt dir Hierarchie:
$ 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:. enthält int main(){}
, src / log / LOG.CPP enthält void f(){}
Unter Berufung auf make
produziert (der Kürze halber bearbeitet):
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
Das Problem ist, die ersten drei Zeilen: LOG.CPP kompiliert wird zweimal
Die Frage: , warum es nicht nur einmal erstellt - die Hälfte der Zeit zu nehmen,
Hinweis: Ich habe keine Ahnung, was ich tue - Autotools ist schwarze Magie für mich, aber wir haben es in unserem Ort zu nutzen. Die Dokumente sind mir unverständlich.
Lösung
Standardmäßig Libtool erstellt zwei Arten von Bibliotheken: statische und geteilt. (Aka libFoo.a und libfoo.so)
Statische und Scherbe erfordern unterschiedliche Kompilation Fahnen. Dynamische Bibliotheken - Shared Objects verwendet Position Unabhängige Codes mit folgenden gcc Fahnen:
-fPIC -DPIC
Static nicht. Sie können bauen nur eine Art erzwingen, indem specifing
./configure --disable-shared
oder
./configure --disable-static
Begründung
Normalerweise, wenn Bibliothek für Benutzer zur Verfügung gestellt wird in zwei Setups bereitstellen - statisch für die Entwicklung, die rein statische ermöglicht schaffen baut und dynamisch für die Verwendung von den meisten von Programmen, die diese Bibliothek nutzen. Also, in der Regel, wenn Sie Bibliothek im System installieren Sie nur freigegebenes Objekt installieren. (Aka libfoo_XYZ.deb)
Wenn Sie Entwicklungsversion (aka libfoo-dev_XYZ.deb) Sie Header hinzufügen und statisch Build-Version der Bibliothek, die Benutzer machen staic ermöglicht baut, wenn sie whant.
Dies ist gängige Praxis für den Versand Bibliotheken in UNIX. So libtool tut dies für Sie automatisch.