كيفية إنشاء ثنائي .وذلك باستخدام libtool
سؤال
لدي مجموعة من cpp الملفات التي أريد تجميع مباشرة في الثنائية و أيضا ترجمة في المكتبة المشتركة.
لدي
bin_PROGRAMS=mybin
lib_LTLIBRARIES=libmylib.la
COMMON_SOURCES=f1.cpp f2.cpp f3.cpp
mybin_SOURCES=main.cpp $(COMMON_SOURCES)
libmylib_la_SOURCES=$(COMMON_SOURCES)
عند تشغيل هذا cpp يتم تجميع الملفات مرتين ، مرة مع libtool مرة واحدة دون وأحيانا libtool/automake يشكو
Makefile.am: object `f1.$(OBJEXT)' created both with libtool and without`
حاولت وضع COMMON_SOURCES في .ملف لكن libtool يشكو عندما ربط .مع .لا (قوله ليس المحمولة).
ما أريده هو شيء من هذا القبيل
bin_LTPROGRAMS=mybin
ولكن هذا لا وجود له
تحرير:توضيح - أنا باستخدام automake/autoconf.ما لدي هو مبين أعلاه هو اللحم من automake Makefile.am
المحلول
القضية هي أن المصادر الشائعة يجب تجميعها بشكل مختلف عندما تكون في مشترك كائن من عند تبذل في ثابت الأرشيف.في الحالة الأولى ، على سبيل المثال ، g++
يجب أن تكون مرت -fPIC
العلم.
أقترح استخدام اثنين بناء الدلائل.
على افتراض هذا المصدر الهرمي:
./src/Makefile.am ./src/f1.cpp ./src/f2.cpp ./src/f3.cpp ./src/main.cpp ./configure.ac ./Makefile.am
يمكنك استخدام شيء مثل هذا في ./src/Makefile.am
:
bin_PROGRAMS = mybin lib_LTLIBRARIES = libmylib.la mybin_SOURCES = main.cpp mybin_LDADD = libmylib.la libmylib_la_SOURCES = f1.cpp f2.cpp f3.cpp
ثم يمكنك إنشاء الدلائل Release
و ReleaseDisableShared
في ./
.في الدليل ./Release
تشغيل:
../configure && make
و في ./ReleaseDisableShared
تشغيل:
../configure --disable-shared && make
بعد بناء في كل بناء الدليل ، mybin
في ./ReleaseDisableShared/src/mybin
و libmylib.so
في ./Release/src/libmylib.so
.
انظر أيضا:
نصائح أخرى
رابط ضد المكتبة من المصادر الشائعة على وجه التحديد:
bin_PROGRAMS = mybin
lib_LTLIBRARIES = libmylib.la
mybin_SOURCES = main.cpp
mybin_LDADD = libmylib.la
libmylib_la_SOURCES = f1.cpp f2.cpp f3.cpp
إذا libmylib.la
ينتهي باستخدام ملفات لا يجب أن تكون مرتبطة في mybin
, إنشاء libtool الراحة المكتبة, باستخدام Makefile.am
شيء من هذا القبيل:
bin_PROGRAMS = mybin
noinst_LTLIBRARIES = libcommon.la
lib_LTLIBRARIES = libmylib.la
mybin_SOURCES = main.cpp
mybin_LDADD = libcommon.la
libmylib_la_SOURCES = f4.cpp f5.cpp f6.cpp
libmylib_la_LIBADD = libcommon.la
libcommon_la_SOURCES = f1.cpp f2.cpp f3.cpp
هذا الرابط f1.cpp
, f2.cpp
, f3.cpp
, f4.cpp
, f5.cpp
و f6.cpp
في libmylib.la
و main.cpp
, f1.cpp
, f2.cpp
و f3.cpp
في mybin
.
إذا كان الهدف يحتوي على كل هدف CFLAGS
(أو ما شابه) ، automake
سوف تجعل منفصلة ملفات الكائن في بناء هذا الهدف.حاول إضافة بعض لا-op أعلام mybin
, شيء مثل:
mybin_CPPFLAGS = -I.
أو
mybin_CPPFLAGS = -DDUMMY -UDUMMY
عليك أن تعطي الكائن الملفات التي تم إنشاؤها مع libtool ملحق مختلف حتى لا الصراع.في الواقع, هذه الملفات هي ملفات نصية تحتوي على المعلومات الوصفية لكل كائن الملفات المنقولة وغير المنقولة code (هذا هو التحكم -الموافقة الحرة المسبقة المستنيرة دول مجلس التعاون الخليجي وسيطة سطر الأوامر).الحقيقية الملفات التي تم إنشاؤها من قبل libtool عادة ما تكون مخزنة في ".يبس" فرعي.الأساسية makefile سوف تبدو مثل هذا:
CC = $(CXX)
LIBTOOL = libtool --quiet
SRC = lib.cpp test.cpp
LIB_SRC = lib.cpp $(SRC)
LIB_OBJ = $(LIB_SRC:.cpp=.lo)
EXE_SRC = exe.cpp $(SRC)
EXE_OBJ = $(EXE_SRC:.cpp=.o)
EXE = test
LIB = libmylib.la
all: $(EXE) $(LIB)
clean:
$(RM) *.o *.lo $(EXE) $(LIB)
$(EXE): $(EXE_OBJ)
$(LIB): $(LIB_OBJ)
$(LIBTOOL) --tag=CXX --mode=link $(LINK.cc) -shared -version-info 1:0 -rpath $(shell readlink -f .) -o $@ $< $(LDLIBS)
%.o: %.cpp
$(COMPILE.cc) -o $@ $<
%.lo: %.cpp
$(LIBTOOL) --mode=compile --tag=CXX $(COMPILE.cc) -o $@ $<