Makefile, Kompilieren und Verknüpfen

8

Ich habe eine Frage zum Kompilieren und Verknüpfen in Makefile (und vielleicht im Allgemeinen).

Ich habe eine server.c Datei, die aus dem Hauptprogramm besteht, das eine main() Funktion hat. server.c enthält rio.c. Ich habe ein Modul namens rio , das aus rio.c und rio.h besteht. Es hat keine main() -Funktion.

Ich habe zwei Fragen, wie man das Makefile wirklich schreibt, und die beste Vorgehensweise, um so etwas zu tun.

Q1: Wie schreibe ich das Makefile

Ich habe folgendes Makefile:

%Vor%

Ich habe damit Probleme zu verknüpfen. Es besagt, dass ich mehrere Definitionen aller in C verwendeten Funktionen habe. Ich bin mir nicht sicher, wie dies möglich ist, da server.c mit dem -c -Flag kompiliert wird, so dass nichts wirklich verknüpft ist. Es sollte wissen, dass einige Funktionen existieren, aber nicht wirklich verknüpfen, bis die all -Regel beide Objektdateien zusammenstellt und eine einzelne Objektdatei erzeugt, die alles verknüpft hat.

Was ist das Problem hier?

Q2: Best Practice Da ich ein Modul und dann noch eine Datei habe, die das Hauptprogramm enthält, sollte ich das Hauptprogramm server.c als separates Modul kompilieren und dann beide zusammen in all kompilieren, oder server.c in alle kompilieren und die rio.o Modul dort? Beachten Sie, dass dies immer noch das gleiche Linkproblem erzeugt, das ich oben habe, also bin ich mir ziemlich sicher, dass mein Problem woanders liegt.

    
darksky 01.12.2012, 23:10
quelle

1 Antwort

13

Sie sollten die Struktur etwas überarbeiten:

%Vor%

Der Unterschied ist, dass die Phoney-Regel all davon abhängt, dass sysstatd aktuell ist und sysstatd aktuell ist, wenn es sich um die Objektdateien handelt.

Nun ist es nur noch ziemlich ausführlich, die Kompilierungsaktionen explizit zu schreiben. Es wäre ausreichend zu verwenden:

%Vor%

Sie könnten auch debattieren: Verwendet server.c nicht rio.h ? Wenn dies der Fall ist, sollte die Abhängigkeit aufgelistet werden. Wenn nicht, warum existiert rio.h ? make wird davon ausgehen, dass server.o von server.c abhängt, Sie müssen das also nicht angeben (aber es werden keine Annahmen über die Header gemacht). Sie können auch ein Makro verwenden, um die Wiederholung des Programmnamens zu verhindern:

%Vor%

Wenn Sie andere Bibliotheken benötigen, können Sie Folgendes verwenden:

%Vor%     
Jonathan Leffler 02.12.2012, 21:14
quelle

Tags und Links