Introduksiyon

Sa programa, ang isang programa ay kadalasang nahahati sa maraming talaksan ng pinagmulan at header files upang pagbutihin ang kaayusan, muling maorganisa, at makabuo ng bilis ng pag - aayos. Gayunman, ang modularidad na ito ay nagpapakilala ng isang hamon: kapag ang isang header file ay nagbabago, bawat source file na kinabibilangan nito ay dapat na muling i-compil. Ang paggawa ng manwal na ito ay mali sa pag - aayos ng autoprone at ang panahon ay nagresultang.Gawin ang mgafile, bunsod ng Paggawa ng Ang paggawa ng mga kagamitang ito sa pamamagitan ng computer, paglutas sa mga bagay na ito sa pamamagitan ng computer at paggawa ng mga prosesong may kinalaman sa mga pamamaraang madaling - gulang, ang mga ito ay kusang - gulang.

Ano ang Ginagawang mga Polusyon?

Ang A Makefile ay isang payak na talaksang aksesorya na nagbibigay ng kahulugan sa isang set ng mga alituntunin para sa pagtatayo ng isang proyekto. Ang paggawa ng ay kababasahan ng mga tuntuning ito, sinusuri ang mga file timestamp, at isinasagawa lamang ang mga utos na kinakailangan upang makabuo ng proyekto hanggang sa kasalukuyan. Ang pinaka - ubodng ideya ay simple: bawat tuntunin ay may [[FLL]:2] hinggil sa mga utos[[F.[TC.[TC.[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T] [[T][T] [[T] [[T] [[T][T] [[T][T][T] [[T][T] [[T][T] [[T] [[T] [[T] [[C.

Ang Makefile ay naging bahagi ng Unix mula noong 1970s, at ang GNU Make ay ang de facto na pamantayan sa Linux at macoS. Ang cossaul ay maikli ngunit makatwiran; ang pagkuha ng dependensiya ay ang pangunahing kasanayan na kailangan ng isang C developer.

Pag - unawa sa mga Dependensiya

Sa isang proyektong C, ang dependencies ay hindi limitado sa mga talaksang . Ang bawat talaksang pang-estadistika ay kinabibilangan ng isa o higit pang mga talaksang pang-ulo (e.g., ). . Mga talaksang pang-ebolusyon na kinabibilangan nito ay dapat na i-compiled. Gayundin, ang mga talaksang bagay ay nakasalalay sa kanilang mga kaukulang talaksang , at ang pangwakas na produkretable sa lahat ng mga talaksang bagay.

Mga Dependensiya sa Paglalabas ng dumi

Sa maagang Makefiles, itinala ng mga programmer ang lahat ng mga kahilingan nang manu - mano. Ang pamamaraang iyan ay maselan: ang paglimot sa isang header ay nangangahulugan ng mga lumang materyales, samantalang itinatala ang napakaraming mga sanhi ng di - kinakailangang mga recompile.: Habang lumalaki ang proyekto, ang mga talaan ng manwal ay nagiging hindi na maaaring gamitin. Ang modernong solusyon ay kusang gumawa ng mga dependensiya, ginagawa itong ganap, ginagawang mga aparatong de - makina.

Ang isang mahusay na Mykecrafted Makefile ay tinatrato ang mga dependencies bilang isang unang calclass na pagkabahala. Ang tunguhin ay hindi kailanman muling buuin ang anumang bagay na nangangailangan ng rekonstruksiyon, at laging muling itayo ang lahat ng bagay na ginagawa. Ang pagiging tama [[ sa mga gusaling inskriprimental.

Pangunahing Tubo ng Isang Gawad - gawang Kayarian

Ang karaniwang Makefile ay naglalaman ng iba't ibang kahulugan, tuntunin, at huwad na mga target.

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

Ang Makefile na ito ay may apat na mga target: (ang maaaring gamitin), dalawang talaksang bagay, at isang huwad na target .[Ang mga linya ng dependensiya pagkatapos ng colon ay nagsasabi ay gumagawa ng na mga file na susuriin bago magpasiyang muling itayo ang target.

Mabuway na mga Target

Ang mga target na gaya o ay hindi kumakatawan sa mga file. Upang maiwasan gumawa] mula sa paggulo sa mga ito sa pamamagitan ng mga files, ang mga ito ay dapat na ipahayag bilang :

.PHONY: clean all

Kung wala ito, kung umiiral ang isang talaksang may pangalang , ang paggawa ay isasaalang-alang ito sa ⁇ to ⁇ date at hindi ito mabisa sa resipi.

Mabisang Pagmamamaniobra sa mga Dependensiya

Ang manwal na Makefile sa itaas ay may malubhang depekto: ang pagdepende sa ]] ay tama, ngunit ano naman ang masasabi tungkol sa mga header? kung pagbabago, (na kinabibilangan nito) ay dapat na itayong muli, ngunit ang tuntunin ay depende lamang ito sa . Ang solusyon ay hayaang ang tagabuo ay gumawa ng tunay na tala.

Automatikong Pag - aalsa sa GCC

Ang GCC (at ang Clang) ay maaaring lumikha ng impormasyong dependensiya gamit ang pamilya ng mga watawat.[ Ang pinakapraktikal na kombinasyon para sa karamihan ng mga proyekto ay :

  • [[ – sumulat ng isang dependency file (]) sa panahon ng pag-iipon, na nagtatala lamang ng mga user na gumagamit ng surminate deficied headers (hindi system headers).
  • [ – Ilahad ang pangalan ng talaksang dependensiya.
  • [[ – magdagdag ng mga pekeng target para sa bawat header, na pumipigil sa mga pagkakamali kapag tinanggal ang isang header.

Dito sa mga taga - Here kung paano ilakip ang awtomatikong pagsubaybay sa dependensiya tungo sa Makefile:

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

Paliwanag:

  • Iniipon ang lahat ng mga files sa source directory.
  • ang mga ito ay ginagawang mga landas na hindi na kailangan.
  • Ang mga talaksang dependensiya (e.g., ).
  • Ang tuntuning pattern ay nagtitipon ng bawat talaksan at, dahil sa , lumilikha ng isang talaksang bilang side effect.
  • Ang linya ay kababasahan ng mga pinanggagalingang files, na ginagawang tunay na Makefile requests. Ang gatlang () ay sumusugpo sa mga pagkakamali kapag ang mga talaksang ay hindi pa umiiral (hal., sa unang bolyum).

Ngayon, kung babaguhin, ang susunod na pagpapawalang bisa ay kusang magkokompile dahil sa ang file para sa ay kinabibilangan bilang isang prepektura.

Patiunang Pamamaraan

Ligtas na Pakikitungo sa mga Dependensiya na Walang Paa

Kapag inalis ang isang header, maaaring banggitin pa rin ito ng file, na nagiging dahilan upang gumawa ng upang mabigo sa nawawalang pagkakamali sa target. Ang bandila ay nagreresulta rito sa pamamagitan ng pagdaragdag ng walang laman na mga tuntuning huwad para sa bawat tagapangulo ng dependensiya. Ang ay tumatakbo lamang sa huwad na alituntunin (na walang ginagawa) at nagpapatuloy.

Pag - uugnay ng mga Bulaang Dependensiya Pagkatapos ng mga Pagbabago sa Pinagmulan

Isang diagnosty: kung ang isang talaksang pang-source ay nagdaragdag o nag-aalis ng isang , ang katumbas na talaksang ay dapat na muling likhain. Dahil ang file ay isang mismong kailangan ng talaksang bagay, Ang paggawa ng ay mapapansin ang binagong timestamp at recompile, na muling binabago ang [[T:4] file na ito ay awtomatikong bumubuo ng[1].

Paggamit ng Kaayusan Tanging mga Prerehiyo

Kung minsan kailangan mo ang isang directory bago ang pagtatayo, subalit nais mo ng committ na simulan ang isang muling pagtatayo.[T:0]order[kailangan ng sanggunian] (na pinili ng ).

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

$(OBJDIR):
 mkdir -p $@

Tinitiyak nito na ang directory ay nilikha bago ang anumang koleksyon, subalit ang pagbabago sa directory mismo (hal.g., isang bagong talaksan sa loob) ay hindi mag-uuudyok ng muling pag-iimbento.

Pinakamabuting Gawain sa Pagmamaniobra ng mga Dependensiya

  1. Use automatic dependency generation mula sa araw Kahit para sa isang proyektong calculusfile, ito ay nagreresulta sa isang mabuting bisyo.Ito ay walang gastos at pumipigil sa mga pagkakamali sa hinaharap.
  2. Panatilihing hiwalay ang mga talaksang dependensiya sa mga talaksang source.[ Ilagay ang mga ito sa isang o directory.Dahil dito, nagiging mas madali ang paglilinis at naiiwasan ang pagkakalat ng punong pinagmulan.
  3. Ilagay ang nalikhang files matapos ang mga tuntunin na lumilikha nito. Ang utos ay mainam, ngunit ang paglalagay nito ayon sa tuntuning pang-ttern ay tumitiyak na ang unang gumagawa ang unang nakakaalam kung paano gumawa ng mga talaksang bagay bago subukang basahin ang mga talaksang [[TL5].
  4. Use huwad na mga target para sa pag-aayos ng bahay.[[ , , , at ]][Laging ipahayag ang mga ito sa pamamagitan ng .
  5. Ang mga variable sa pagtitipon ng mga bandila, source directories, at listahan ng mga file. Ito ay gumagawa sa Makefile na muling magagamit sa ibayo ng mga proyekto at mas madaling i-transmit.
  6. [T] Test you Makefile sa pamamagitan ng sinadyang pagbabagong-ulo. Modify a header, run , at pagtibayin lamang ang mga apektadong talaksan ng bagay ay muling i-compilation. Kung mangyari ang isang ganap na muling pagtatayo, may mali sa dependency tracking.
  7. Panatilihing simple ang Makefile ngunit hindi mas simple kaysa kinakailangan.[ Ang labis na pag-eeengineering na may mga makabagong tungkulin tulad ng ay maaaring makapagpahirap ng pag-alis.Simula sa parisang ipinakita sa artikulong ito; ito ay tumatantiya ng mga maraming files.

Mga Yaman sa Labas

Para lumalim ang iyong kaunawaan, tingnan ang mapananaligang mga reperensiyang ito:

Pagsasaayos

Ang pagkontrol sa mga dependensiya ng programang C sa Makefiles ay hindi isang luho kundi isang pangangailangan para sa anumang proyekto na nakahihigit sa isang file. Sa pagsasama ng mga tuntunin sa huwaran, awtomatikong salinlahi ng dependensiya kasama , at maingat na paglalagay ng mga talaksan , maaari kang lumikha ng isang sistema ng pagtatayo na kapuwa mabilis at tama. Ang mga pamamaraan na ipinakikita rito ay nag - aalis ng manu - manong pagsubaybay, binabawasan ang mga panahon ng paggawa ng mga bug na sanhi ng sirang mga bagay.