Медлительность Libtool, двойное строительство?

В моем проекте модули организованы в поддиректории для аккуратности.

Иерархия папок моего проекта:

$ 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: содержит int main(){}, src/log/log.cpp содержит void f(){}.

Вызов make производит (отредактировано для краткости):

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

Проблема в первых трех строках: log.cpp компилируется дважды!

Вопрос: почему он не компилируется один раз, что занимает половину времени?

примечание: я понятия не имею, что делаю — автоинструменты для меня — черная магия, но мы должны использовать их на своем месте. Документы для меня непонятны.


person Community    schedule 21.02.2009    source источник


Ответы (1)


По умолчанию Libtool создает два типа библиотек: статические и общие. (также известные как libfoo.a и libfoo.so)

Для статических и шардовых файлов требуются разные флаги компиляции. Динамические библиотеки -- общие объекты используют позиционно-независимый код со следующими флагами gcc:

-fPIC -DPIC

Статические нет. Вы можете принудительно построить только один тип, указав

./configure --disable-shared

or

./configure --disable-static

Обоснование

Обычно, когда библиотека предоставляется пользователю, она предоставляется в двух вариантах: статическом для разработки, что позволяет создавать чисто статические сборки, и динамическом для использования большинством программ, использующих эту библиотеку. Итак, обычно, когда вы устанавливаете библиотеку в систему, вы устанавливаете только общий объект. (он же libfoo_XYZ.deb)

Когда вы добавляете версию для разработки (также известную как libfoo-dev_XYZ.deb), вы добавляете заголовки и статически собираете версию библиотеки, которая позволяет пользователям делать статические сборки, если они того захотят.

Это обычная практика доставки библиотек в UNIX. Таким образом, libtool делает это за вас автоматически.

person Artyom    schedule 21.02.2009
comment
В качестве дополнительного вопроса, хорош ли мой Makefile.cvs? Я его откуда-то скопировал, потому что это позволило мне избавиться от кучи бесполезных файлов, вроде depcomp или config.h.in - person ; 21.02.2009
comment
Команды в вашем Makefile.cvs обычно идут в autogen.sh - person Artyom; 21.02.2009
comment
Там нет ничего, что выглядело бы так, как будто ему нужен пользовательский autogen.sh, я думаю, что OP может быть в порядке, просто запустив autoreconf -i для загрузки проекта. Кроме того, чтобы скрыть такие сценарии, как depcomp, добавьте AC_CONFIG_AUX_DIR([auxfiles]) в configure.ac. Чтобы скрыть файлы *.m4, добавленные libtoolize, добавьте AC_CONFIG_MACRO_DIR([m4]) в configure.ac и ACLOCAL_AMFLAGS = -I m4 в Makefile.am верхнего уровня. - person Jack Kelly; 03.09.2010