سؤال

لديّ قالب صنع لتجميع DLL واحد (لنظام البرنامج المساعد). يبدو أن Makefile of the User:

EXTRA_SRCS=file1 file2
include makefile.in

في ال makefile.in أملك:

plugin.dll: plugin.os $(patsubst %,%.os,$(EXTRA_SRCS))

أين plugin.os هو ملف C ++ الرئيسي المراد تجميعه. راجع للشغل ، والملفات تنتهي .os هل تم تجميع ملفات الكائن للمكتبة المشتركة (أي باستخدام -fpic الخيار مع gcc)

الآن ، المشكلة هي أن المصادر الإضافية ربما (ولكن ليس بالضرورة) تكون ملفات رأس. من الناحية المثالية ، أود إضافتها كتبعيات للهدف plugin.os و ال file.cpp, ، ولكن فقط إذا كانت موجودة.

يجب أن تعمل الطريقة لكل من Windows و Linux ، أو على الأقل قابلة للتكيف مع كل منها. ومع ذلك ، أنا فقط استخدم إصدار GNU من Make.

هل كانت مفيدة؟

المحلول

استخدم وظيفة "Wildcard":

$(wildcard *.h)

تحرير: من أجل مطابقة قائمة محددة ، افعل

$(wildcard $(HEADER_FILES))

ليست هناك حاجة لاستخدام $ (Filter ...) ، تقوم دالة WildCard تلقائيًا بتصفية الملفات غير الموجودة.

نصائح أخرى

لم تقم بتحديد المترجم (المترجمات) التي تستخدمها ، ولكن إذا كان لديك إمكانية الوصول إلى GCC/G ++ ، فيمكنك استخدام خيار -mm.

ما أقوم به هو إنشاء ملف مع امتداد .D لكل ملف .c أو .cpp ، ثم "تضمين" ملفات .D. أستخدم شيئًا كهذا في Makefile:

%.d: %.c
        gcc $(INCS) $(CFLAGS) -MM $< -MF $@

%.d: %.cpp
        g++ $(INCS) $(CXXFLAGS) -MM $< -MF $@

ثم أقوم بإنشاء تبعيات مثل هذا:

C_DEPS=$(C_SRCS:.c=.d)
CPP_DEPS=$(CPP_SRCS:.cpp=.d)
DEPS=$(C_DEPS) $(CPP_DEPS)

وهذا في أسفل Makefile:

include $(DEPS)

هل هذا هو نوع السلوك الذي ستذهب إليه؟ إن جمال هذه الطريقة هو أنه حتى لو كنت تستخدم برنامج التحويل البرمجي غير GNU للتجميع الفعلي ، فإن مجموعة GNU تقوم بعمل جيد في حساب التبعيات.

هل البساطة

$(filter $(wildcard *.h),$(HEADER_FILES))

افعل ما تريد؟

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