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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top