2016-04-04 3 views
1

Ich habe ein Problem, dass ich einfach nicht meinen Kopf wickeln kann. Ich habe ein minimales Beispiel-Makefile, das eine sehr einfache .c-Datei in ein ausführbares Programm kompilieren soll.Genau die gleiche Befehlszeile erzeugt einen Fehler in Make, ist aber erfolgreich, wenn es von Shell ausgeführt wird

Wenn ich laufen machen, startet der Compiler kompiliert und erzeugt dann eine Fehlermeldung

"T:\printOffsets.c:10:21: error: bootIfc.h: No such file or directory"

Dann kopiere ich die exakt gleiche Kommandozeile machen wird mit dem Ziel zu bauen und führen Sie es direkt in die gleiche Windows-Shell-Instanz, und die Kompilierung ist plötzlich fehlerfrei! Die Befehlszeile lautet (Pfadnamen wurden vereinfacht):

T:\perl\c\bin\gcc.exe T:\printOffsets.c -IT:\include\ -o D:\printOffsets.exe

Woher weiß ich das? Nun, make druckt die Befehlszeile, bevor es ausgeführt wird, also kopiere ich einfach & Paste aus der Shell.

Ich verstehe es nicht! Wie ist das möglich?? Wie kann derselbe Befehl auf der Shell funktionieren und fehlschlagen, wenn er von einem Makefile gestartet wird ??

Ich benutze übrigens GNU Make 3.82 unter Windows 7.

+1

Könnten Sie mit Schrägstriche versuchen statt Schrägstriche? Ich glaube, ich habe irgendwann das gleiche Problem und die Verwendung von Schrägstrichen war in einigen Fällen besser. – jdarthenay

+1

Vielleicht nutzt Make auch nicht die Shell, von der Sie glauben, dass Sie ein Ziel in Ihrem Makefile hinzufügen können, um echo $ (SHELL) zu starten? – jdarthenay

+0

@jdarthenay Sie sind genau richtig !! Es verwendet sh.exe, nicht die Windows-Befehlsshell! Und das Ersetzen aller Backslashes durch Schrägstriche hat das Problem behoben! Könntest du deinen Kommentar als Antwort posten, damit ich ihn annehmen/abstimmen kann? – antred

Antwort

3

Wenn der Befehl in Makefile unterschiedliche Ergebnisse von der Shell liefert, stellen Sie sicher, dass er die gewünschte Shell verwendet.

ein Pseudoziel in Ihrem Make-Datei hinzufügen:

.PHONY:testshell 

testshell: 
    echo $(SHELL) 

Und laufen:

gmake testshell 

Wenn das Ergebnis nicht Ihre Lieblingsschale Sie es indem Sie eine Zeile wie diese zwingen kann, am Anfang Ihres Makefiles:

SHELL=C:\Windows\System32\cmd.exe 

Wenn Sie nicht sicher sind, ob der vollständige Pfad Ihrer Shell vorhanden ist, öffnen Sie einfach ein DOS-Konsole und den Start:

where cmd 

Edit: alternative Lösung

Bei der Verwendung von sh Schale statt cmd Shell können Sie ersetzt auch alle Schrägstriche in Befehle mit Schrägstrichen und halten sh verwenden.

Edit 2: change shell for a single target

+0

Ist es möglich, die Shell so zu ändern, dass sie nur für das Rezept eines bestimmten make-Ziels verwendet wird, aber alle anderen Ziele weiterhin die Standard-Shell verwenden? – antred

+0

@antred Keine Ahnung, wie man das machen könnte. Vielleicht ist es möglich, den Wert von 'SHELL' zu ändern, aber ich habe es nie versucht. – jdarthenay

+1

@antred Vielleicht können Sie von bash aus einen einzelnen cmd Befehl mit 'cmd/C echo toto' starten und das Gegenteil sollte auch möglich sein. – jdarthenay

Verwandte Themen