سؤال

في مشروعي، يتم تنظيم الوحدات النمطية في 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 هذا لك تلقائيا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top