2009-02-21 2 views
3

В моем проекте модули организованы в поддирерах для аккуратности.Недостаток 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/журнал/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 собран в два раза!

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

Примечание: Я понятия не имею, что я делаю - Autotools не черная магия для меня, но мы должны использовать его в нашем месте. Документы мне непостижимы.

ответ

3

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

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

-fPIC -DPIC 

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

./configure --disable-shared 

или

./configure --disable-static 

Обоснование

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

При добавлении разрабатываемой версии (ака libfoo-dev_XYZ.deb) вы добавляете заголовки и статический версии сборки библиотеки, которая позволяет пользователям делать staic строит, если они whant.

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

+0

спасибо, --disable-shared работает как шарм! – 2009-02-21 10:44:11

+0

Как вопрос стороны, мой Makefile.cvs хорошо? Я скопировал его откуда-то, потому что это позволило мне избавиться от кучи бесполезных файлов, таких как «depcomp» или «config.h.in» – 2009-02-21 10:48:32

+0

. Команды в вашем файле Makefile.cvs обычно идут в autogen.sh – Artyom