Domanda

Nel mio progetto, i moduli sono organizzati in sottocartelle per ordine.

Il mio progetto gerarchia 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:. contiene int main(){}, src / log / LOG.CPP contiene void f(){}

Invocare make produce (a cura per brevità):

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

Il problema è che le prime tre righe: LOG.CPP viene compilata due volte

La domanda:? perché non è appena compilato una volta - prendendo la metà del tempo

Nota: Non ho idea di quello che sto facendo - autotools è la magia nera per me, ma dobbiamo usarla al posto nostro. La documentazione è per me incomprensibile.

È stato utile?

Soluzione

Per impostazione predefinita Libtool crea due tipi di librerie: statiche e condivise. (Aka libfoo.a e libfoo.so)

statico e frammento richiedono diversi flag di compilazione. librerie dinamiche - oggetti condivisi utilizzare Posizione Codice indipendente con seguente bandiere gcc:

-fPIC -DPIC

Static non lo sono. È possibile forzare costruire un solo tipo specifing

./configure --disable-shared

o

./configure --disable-static

Motivazioni

Di solito quando biblioteca è prevista per l'utente che fornisce in due configurazioni - statico per lo sviluppo che permette di creare statica pura costruisce e dinamico per l'uso da più dei programmi che utilizzano questa libreria. Così, di solito quando si installa biblioteca nel sistema si installa solo oggetto condiviso. (Aka libfoo_XYZ.deb)

Quando si aggiunge versione di sviluppo (aka libfoo-dev_XYZ.deb) si aggiungono le intestazioni e staticamente costruire versione della libreria che permette agli utenti di effettuare staic costruisce se whant.

Questa è una pratica comune per le biblioteche di trasporto in UNIX. Così fa questo per libtool automaticamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top