2010-04-09 13 views
25

(Mam Linux Ubuntu 9.10, więc rozszerzenie dla pliku wykonywalnego to plik wykonywalny.out) Właśnie dostaję się do programowania modułowego (programowanie z wieloma plikami) w C i chcę wiedzieć jak skompiluj wiele plików w jednym pliku Makefile. Na przykład, jaki byłby plik Makefile do kompilowania tych plików: main.c, dbAdapter.c, dbAdapter.h? (Nawiasem mówiąc, jeśli jeszcze tego nie wiesz, główna funkcja jest w main.c) Czy ktoś mógłby umieścić link do dokumentacji pliku Makefile?Skompiluj wiele plików C z make

Odpowiedz

26

Zobacz mój Makefile Tutorial: How To Write A Makefile. Udostępnia on dobrze spreparowany plik Makefile, który zbuduje taki projekt (z wieloma plikami źródłowymi C i C++), wyjaśnia, jak to działa, i ostrzega przed typowymi pułapkami, a także słabymi programami makefile, które są zbyt często spotykane w dzikiej dziczy. .

+1

Po prostu zaktualizowałem i chętnie usłyszę opinię. –

+2

Link już nie żyje. – Pat

+0

@MichaelAaronSafyan Ponieważ dążysz do obsługi wielu platform, czy masz jakieś rady dotyczące czyszczenia pliku programu, gdy w systemie Windows plik jest wysyłany do $ (program_NAME) .exe? –

32

Opublikowane linki są dobre. Dla konkretnego przypadku możesz to wypróbować. Zasadniczo wszystkie pliki Makefile są zgodne z tym wzorcem. Wszystko inne to skróty i makra.

program: main.o dbAdapter.o 
    gcc -o program main.o dbAdapter.o 

main.o: main.c dbAdapter.h 
    gcc -c main.c 

dbAdapter.o dbAdapter.c dbAdapter.h 
    gcc -c dbAdapter.c 

Kluczową sprawą jest to, że Makefile analizuje reguły sekwencyjnie i buduje, ponieważ niektóre elementy są potrzebne.

Najpierw obejrzy program i zobaczy, że do zbudowania programu potrzebne są coś pod nazwą main.o i dbAdapter.o.

Następnie zostanie znalezione główne urządzenie. Jednak do zbudowania main.o potrzebne będą main.c i dbAdapter.h (zakładam, że dbAdapter.h jest zawarty w main.c).

Użyje tych źródeł do zbudowania pliku main.o, kompilując go za pomocą gcc. -c wskazuje, że chcemy tylko kompilować.

Robi to samo z dbAdapter.o. Kiedy ma te dwa pliki obiektów, jest gotowy do połączenia ich. Używa również kompilatora gcc dla tego kroku. -o wskazuje, że tworzymy plik o nazwie program.

+3

... z tym wyjątkiem, że nie powinieneś mocno kodować kompilatora i powinieneś wykorzystać predefiniowane reguły kompilacji ... zobacz mój samouczek. –

+5

Oczywiście masz rację. Ale OP jest stosunkowo nowy w Makefiles i chciałem pokazać podstawowy proces bez żadnego pośrednictwa. – aduric

+3

"Ale OP jest stosunkowo nowy w Makefile" - w którym powinieneś zacząć go od właściwej ścieżki, zamiast umieszczać typowe błędy w swoim pierwszym przykładzie. – mk12