libtool slowness، مبنى مزدوج؟
سؤال
في مشروعي، يتم تنظيم الوحدات النمطية في Subdirs للراحة.
مشروعي 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: يحتوي على int main(){}
, SRC / سجل / 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 هو سحر أسود بالنسبة لي، لكن علينا استخدامه في مكاننا. المستندات غير مفهومة لي.
المحلول
بشكل افتراضي Libtool يخلق نوعين من المكتبات: ثابت ومشاركة. (ويعرف أيضا باسم libfoo.a و libfoo.so)
ثابت وشارد تتطلب إشارات تجميع مختلفة. المكتبات الديناميكية - الكائنات المشتركة استخدم الوظيفة رمز مستقلة مع إشارات دول مجلس التعاون الخليجي التالية:
-fPIC -DPIC
ساكنة ليست كذلك. يمكنك إجبار بناء نوع واحد فقط من خلال تحديد
./configure --disable-shared
أو
./configure --disable-static
الأساس المنطقي
عادة عندما يتم توفير المكتبة للمستخدم، فإنه يوفر في جهازين - ثابت للتطوير يسمح بإنشاء بناء ثابت نقي وديناميكي للاستخدام من قبل معظم البرامج التي تستخدم هذه المكتبة. لذلك، عادة عند تثبيت مكتبة في النظام، تقوم بتثبيت كائن مشترك فقط. (ويعرف أيضا باسم libfoo_xyz.deb)
عند إضافة نسخة "تطوير" (AKA LibFoo-Dev_xyz.deb) تضيف رؤوس وإنشاء إصدار ثابت من المكتبة التي تتيح للمستخدمين الذين يقومون بإنشاء Staic إذا كانوا عفاوا.
هذه ممارسة شائعة لمكتبات الشحن في يونيكس. هكذا يفعل libtool هذا لك تلقائيا.