Pregunta

En mi proyecto, los módulos están organizados en subdirectorios de limpieza.

Mi jerarquía dir proyecto:

$ 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(){}

Invocando make produce (editado por razones de brevedad):

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

El problema es que las tres primeras líneas: LOG.CPP se compila dos veces

La pregunta:? ¿Por qué no se trata sólo de una vez compilado - tomando la mitad del tiempo

Nota: No tengo idea de lo que estoy haciendo - autotools es magia negro para mí, pero hay que usarlo en nuestro lugar. Los documentos son incomprensibles para mí.

¿Fue útil?

Solución

Por defecto Libtool crea dos tipos de bibliotecas: estáticas y compartidas. (También conocido como libfoo.a y libfoo.so)

estático y fragmento requieren diferentes banderas de compilación. bibliotecas dinámicas - objetos compartidos utilizar código independiente de posición con las siguientes banderas gcc:

-fPIC -DPIC

estático no lo son. Puede forzar la acumulación sólo un tipo especificando el

./configure --disable-shared

o

./configure --disable-static

Justificación

Por lo general, cuando se proporciona la biblioteca de usuario que proporciona en dos configuraciones - estática para el desarrollo que permite crear estática y dinámica pura construye para su uso por la mayoría de los programas que utilizan esta biblioteca. Así que, por lo general cuando se instala en el sistema de la biblioteca sólo instala objeto compartido. (Aka libfoo_XYZ.deb)

Cuando se agrega versión de desarrollo (también conocido como libtal-dev_XYZ.deb) se agrega encabezados y estáticamente construir la versión de la biblioteca que permite a los usuarios hacer staic construye si whant.

Esta es una práctica común para las bibliotecas de envío en UNIX. Así lo hace por libtool de forma automática.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top