سؤال

لدي مجموعة من 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 $@ $<
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top