Kompiliere irgendein C-Programm mit nur "make" (aus einem Makefile)

8



Ich lerne C-Programmierung durch "Learn C the Hard Way". Ich bin momentan (für ziemlich lange Zeit) auf Übung 2, die hier zu finden ist: Ссылка

Im Abschnitt "extra credit" gibt es eine Aufforderung, das Makefile zu bearbeiten, so dass wir die .c-Datei (ex1.c) nur mit dem Befehl "make" kompilieren können. Genau das sagt die Herausforderung:

  

Erstellen Sie ein all: ex1-Ziel, das ex1 nur mit dem Befehl make erstellt.

Durch hier und eine Reihe anderer Orte, dies ist der Code, den ich für richtig halte:

%Vor%

Wenn ich jedoch versuche, das auszuführen, erhalte ich die kompilierte Datei und bekomme immer einen Fehler:

%Vor%

Was passiert hier? Was ist der Grund für die Fehlermeldung? Wie kann ich das beheben?

Danke Leute.

    
antigravityguy 24.03.2013, 20:14
quelle

3 Antworten

10
  • Wenn all das erste Ziel in Ihrem Makefile ist (ich mache hier eine wilde Vermutung, da Sie nicht das gesamte Makefile gezeigt haben), würde make das als erstes Ziel auswählen, wenn Sie Übergeben Sie kein explizites Ziel von der Befehlszeile (dh nur make )

  • ex1 ist eine Voraussetzung für all , also baut es zuerst und Sie sehen daher die folgende Zeile:

    %Vor%
  • Nachdem ex1 erstellt wurde, versucht make, das Rezept für alle auszuführen, wobei der folgende Befehl ausgeführt wird:

    %Vor%
  • Da -g für sich kein gültiger Befehl oder eine gültige Anwendung ist, die in der Shell ausgeführt werden kann, erhalten Sie diesen Fehler:

    %Vor%

Lösung:

  • Sie haben CFLAGS bereits am Anfang des Makefiles definiert, also müssen Sie es nicht noch einmal im Rezept definieren. Selbst wenn Sie die Variable CFLAGS überschreiben möchten, sollten Sie sie nicht direkt als Teil des Rezepts verwenden.

  • Definieren Sie all und clean als PHONY Ziele, falls dies noch nicht geschehen ist. Das Ziel all und clean erstellen nach der Ausführung des Rezepts keine Datei mit dem Namen all oder clean . Daher ist es empfehlenswert, diese Ziele als PHONY zu klassifizieren.

  • Sie brauchen keine doppelten Anführungszeichen um -Wall

Das folgende Makefile hat all diese Korrekturen:

%Vor%     
Tuxdude 24.03.2013, 20:35
quelle
4
%Vor%

Sollte alles sein, was Sie benötigen, da make über eine integrierte Standardregel verfügt, um eine .c-Datei in eine ausführbare Datei zu kompilieren.

Ihr Fehler besteht darin, eine Variablenzuweisung als Befehl zu verwenden. Der Teil mit

%Vor%

versucht, den Befehl -g mit einer einmaligen Variablenzuweisung CFLAGS="-Wall" auszuführen.

    
Jens 24.03.2013 20:35
quelle
0

Ich möchte eine Anpassung vorschlagen, so dass Sie ex1 nur durch Eingabe von make erstellen können, unabhängig davon, ob dies die erste Kompilierung oder eine Neukompilierung des Quellcodes ist.

Quelle: ex1.c

Makefile:

%Vor%

Durch Hinzufügen des clean Phony-Ziels als erste Voraussetzung für all wird der Befehl rm -rf ex1 ex1.dSYM ausgeführt, bevor der implizierte Befehl cc mit der Voraussetzung ex1 ausgeführt wird .

Auch unter Mac OS-X ist die Verwendung von .PHONY all clean nicht notwendig, damit make die Befehle in Makefile ausführen kann. Es ist jedoch wahrscheinlich ein guter Vorgänger, dass jeder, der den Code später liest, dies erkennt all und clean sind keine eigentlichen Zieldateien.

Oh, und ein großes Dankeschön an Zed A. Shaw dafür, dass du "Learn the Hard Way" auf seiner Seite lesen darfst Lerne C den harten Weg .

    
AMR 22.07.2015 05:10
quelle