מבוא

בתכנות C, תוכנית זו מתחלקת לעתים קרובות על פני קבצים מרובים של מקור וקבצים ראשיים כדי לשפר את הארגון, אחריות, מהירות איסוף.עם זאת, מודולריות זו מציגה אתגר: כאשר קובץ ראש משתנה, כל קובץ מקור הכולל זה חייב להיות recompiled.לעשות את זה באופן ידני הוא שגיאה-pro-ne ו-Timeconsuming. Makefiles, מונע על ידי LTF:0makemakemakeetes כדי לפתח כלי רכב חדש, אך גורם אוטומטי לעשות את זה.

מה הם איפור?

(ב) , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇

הדוגמות היו חלק מ- Unix מאז שנות ה-70, ו-GNU Make הוא תקן דה Facto על לינוקס ו- MacOS. הסינמס הוא תמצית אך יכול להיות עדין; מקבל תלותיות נכונה היא המיומנות העיקרית שיש למפתח C.

הבנה של תלות

בפרויקט C, התלות אינן מוגבלות ל-FLT:0 קבצים.כל קובץ מקור כולל קובץ אחד או יותר ראשי (למשל, FLT:1) אם ראשן משתנה, כל הקבצים FLT:2 קבצים הכוללים אותו יש לדחוס באופן דומה, קבצים אובייקטים תלויים בקבצים המקבילים שלהם: LT, ו- exe הסופי תלוי בכל הקבצים האובייקטים.

ציות נגד תלות בלתי מחייבת

בתחילת Makefiles, מתכנתים ציינו את כל התנאים המוקדמים באופן ידני.גישה זו שברירית: שוכחת כיבוני stale, בעוד הרישום יותר מדי גורם משתבשים מיותרים. גרוע יותר, ככל שהפרויקט גדל, רשימות ידניות הופכות לבלתי ניתנות לקיום.הפתרון המודרני הוא ליצור את הדלפק באופן אוטומטי, להפוך אותם לחסרי משקל, דרישות מראש מכונה.

[ה]ההתורה אינה צריכה לבנות מחדש את כל מה שאינו צריך לבנות מחדש, ותמיד לבנות מחדש את כל מה שעושה זאת.

מבנה בסיסי של איפור

מכלול טיפוסי מכיל הגדרות משתנה, כללים ומטרות מזוינות.כאן הוא דוגמה מינימלית אך פונקציונלית לפרויקט עם FLT:4 ו-FLT:5

CC = gcc
CFLAGS = -Wall -Wextra -O2

main: main.o utils.o
 $(CC) $(CFLAGS) -o main main.o utils.o

main.o: main.c
 $(CC) $(CFLAGS) -c main.c

utils.o: utils.c
 $(CC) $(CFLAGS) -c utils.c

clean:
 rm -f main main.o utils.o

יש לו ארבעה מטרות: FLT:7 (המתקבל), שני קבצים אובייקטים, מטרה מרופנת (FLT:8) קווי התלות לאחר הקולונל אומר FLT:0makeigFLT:1 אשר קבצים לבדוק לפני ההחלטה לבנות מחדש את המטרה.

Phony Targets

(ב) ,ב[[1924]], [[1924]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]]]]]], [[1924]]]]]]]], [[1924]]]]]]]]]]]], [[1924]]]]]]]]

.PHONY: clean all

אם היה קיים קובץ בשם FLT:12;0 [ה], אם היה קיים קובץ בשם FLT:0] , [הרש"י], אם כן, היה צריך לשקול את זה עד עדכני וללג על המתכון.

ניהול תלות יעילה

לפסוק (ב) יש עילה חמורה: הכדאיות של ה-FLT:13 על-פי ה-FLT:14 היא נכונה, אך מה לגבי ראשי התיבות?IfFLT:15: 15: 15: 15 שינויים,FLT:16 (אשר כולל זה) יש לבנות מחדש, אך הכלל אומר כי זה רק תלוי ב-FLT:17 התיקון הוא לתת ל-FLT:17 את ה-upr לייצר את רשימת התלויות אמיתית.

דור תלות אוטומטי עם GCC

GCC (ו-Clang) יכול ליצור מידע תלותי באמצעות משפחת הדגלים (FLT:18) השילוב המעשי ביותר עבור רוב הפרויקטים הוא FLT:19:

  • (FLT:0) ,FLT:20 ; איור 1: כותב קובץ תלות (FeloLT:21) במהלך איסוף, רישום רק ראשי משתמשים מוגדרים (לא ראשים מערכתיים).
  • (ב) ויקרא י"א: "ה' אלקים" (שם כ"ד).
  • (ב) ,0) ,FLT:23irve (ב) , מוסיף מטרות מרופפות לכל ראש, למנוע שגיאות כאשר ראש מוסר.

הנה איך לשלב תלות אוטומטית מעקב אחר איפור:

CC = gcc
CFLAGS = -Wall -Wextra -O2 -MMD -MP
SRCDIR = src
OBJDIR = obj
SRCS = $(wildcard $(SRCDIR)/*.c)
OBJS = $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(SRCS))
DEPS = $(OBJS:.o=.d)

all: myprogram

myprogram: $(OBJS)
 $(CC) $(CFLAGS) -o $@ $^

$(OBJDIR)/%.o: $(SRCDIR)/%.c
 @mkdir -p $(OBJDIR)
 $(CC) $(CFLAGS) -c $< -o $@

-include $(DEPS)

.PHONY: all clean
clean:
 rm -rf $(OBJDIR) myprogram

הסבר:

  • (ב) ,"ה-"ח," (ב)"ה)" (ב"ד)" (ב"ב)"ב[[1924]], [[1924]]
  • [01: 27] הופך אותם לנתיבי קבצים.
  • (ב) ,ב"ה, ב[[1924]], [[1924]]]]
  • (ב) ,ה[[1924]]]], [[1924]]]], [[1924]]]], [[1924]]]], [[1924]]]], [[1924]]]]]]]], [[1924]]]]]], [[1924]]]]]]
  • (ב) כתוב (ב) "ה', ב'[[1924]], [[המאה ה-20]], [[1924]], [[1924]]]], [[1924]]]], [[1924]]]]]], [[1924]]]]]]]], [[1924]]]]]]]]]], [[1924]]]]]]]]]], [[1924]]]]]]

אם כן, אם כן, [ה], [ה], [ה], [ה], [ה], [ה],] ,[ה], [ה],] ,[ה]], [ה],] יהושע [ה'], כתנאי ל'[ה'.

טכניקות מתקדמות

תלות יעילה באופן בטוח

כאשר הוא נמחק, קובץ ה-FLT:44 עדיין יכול להתייחס אליו, מה שגורם ל-FLT:0.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10.10

כולל קבצים תלותיים לאחר שינויים Source

(ב) אם קובץ מקור מוסיף או מסיר קובץ PHFLT, את הקובץ המקביל (FLT:47) יש לשחזר כי קובץ FLT:48 הוא עצמו תנאי מוקדם של קובץ האובייקט, FLT:0makeigphpherph 1 יהיה להבחין בפעמים משתנות ו recompile, אשר regenerates את קובץ ה-LTF:49 פועל באופן אוטומטי.

שימוש במסדר - רק Prerequisites

לפעמים צריך מנהל להתקיים לפני הבנייה, אבל אתה לא רוצה את הזמן שלו כדי ליצור מחדש.זה התפקיד של FLT:0order-רק תנאים מוקדמים של LT:1 (הפרש על ידי FLT:50) בתבנית לעיל, השתמשנו ב-FLT:51 בתוך המתכון; חלופה היא:

$(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR)
 $(CC) $(CFLAGS) -c $< -o $@

$(OBJDIR):
 mkdir -p $@

זה מבטיח את הבמאי נוצר לפני כל אוסף, אבל שינוי למנהל עצמו (למשל, קובץ חדש בפנים) לא יגרור שכפול.

הפרקטיקה הטובה ביותר לניהול תלות

  1. דור התלות האוטומטי של יום אחד, גם לפרויקט חד-מיני, זה הרגל טוב.זה לא עולה דבר ומונע טעויות עתידיות.
  2. (ב) עיין ב[[1924]] ב[[1924]], [[1924]]]], [[1924]]]], [[1924]]]], [[1924]], [[1924]]]]]], [[1924]]]]]], [[1924]]]]]]]]
  3. (ב) ,0) , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
  4. (ב) ,0) ,Use phony for house.And.comph.
  5. (FLT:0) משתנה עבור דגלים, ספרי מקור ורשימות של קבצים.IRFLT:1 זה הופך את התוספת ניתן להתאמה אישית על פני פרויקטים וקל יותר להתאים אישית.
  6. (ב) [17] , ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇ ⁇
  7. (הופנה מהדף "ההה" (ה) "הוציאו את ה"התורה" (ה) פשוט אך לא פשוט יותר מהנדרש.

משאבים חיצוניים

כדי להעמיק את ההבנה שלך, להתייעץ עם אזכורים סמכותיים אלה:

  • (ב) ,0) גנו עושה הדרכה (R) 1:1 - המדריך הסופי לעשות סינטקס, פונקציות, תכונות מתקדמות.
  • [01:0]5] ,364 20,364 20,917 22,113 21,382 17,485 17,485 17,87,440 19,600 18,002 17,320 17,320 17,320 17,320 17,320 17,336
  • (FLT:0) ,Makefile Tutorial by Chase LambertcioFLT:1) - מדריך מעשי, מאורגן היטב המכסה מקרים רבים של שימוש בעולם האמיתי.

מסקנה

ניהול C תכנית תלויה ב- Makefiles אינו מותרות אלא צורך בכל פרויקט המזרז קובץ יחיד.על ידי שילוב כללי דפוס, הדור התלות האוטומטי עם FLT:68, והכללה זהירה של כל פרויקט שנוצר (69 קבצים), באפשרותך ליצור מערכת בנייה שהיא מהירה ותיקון הטכניקות המוצגות כאן מבטלות מעקב ידני, לבנות פעמים, ולמנוע באגים עדינים הנגרמים על ידי קבצים פנימיים: לא תוכל לשנות קבצים ידניים, לא תוכל לשחזר את הקבצים האלה.