/ / Backslashes in Windows Makefiles - Windows, Makefile, mingw

Backslashes in Windows Makefiles - Windows, Makefile, Mingw

Wichtiger Hinweis: Ich habe das Problem seither mit meinem spezifischen Makefile gelöst, weiß aber nicht wie.

Ich habe Backslashes durch Schrägstriche ersetzt, und es stellt sich heraus, dass meine Regeln gut funktionieren. Gcc akzeptiert gemischte Schrägstriche vor und zurück, daher hat es gut funktioniert. Ein Knackpunkt bestand mit mkdir: Es akzeptiert keine Pfade mit gemischten Vor- und Zurück-Schrägstrichen. Ich habe meine Variablen so geändert, dass in der Windows-Version nur hintere Schrägstriche enthalten sind. Jetzt funktioniert die Datei einwandfrei.

Hier finden Sie einige neue Regeln und Variablen:

OUT = $(ROOT)out SRC = $(ROOT)src $(OUT): mkdir $(OUT) $(OUT)/%.o: $(SRC)/%.c $(CC) $(CFLAGS) -o $@ -c $<

Warum akzeptiert minGW-make nach der Variablenerweiterung gemischte Schrägstriche in Regeln, aber nicht nur Backslashes? Was genau geht hier vor?


Ursprünglicher Beitrag

Ich habe eine minGW-Installation von make for windows. Ich habe mein Unix-Makefile kopiert und die Befehle in Windows umgewandelt (und Schrägstriche in Backslashes weitergeleitet), aber das resultierende Makefile funktioniert nicht.

Der Hauptunterschied ist, dass Windows hat $(OUT) = $(ROOT)outwin und Unix hat $(OUT) = $(ROOT)/out. Unix funktioniert gut. make -f makefile.win am Fenster beschwert sich, dass es keine Regel für gibt <root>outwinLinkedList.o. Die fraglichen Regeln und Fehler sind:

make: *** No rule to make target `H:CodeRIT1014SyllablesoutwinLinkedList.o", needed by `H:CodeRIT1014Syllablesoutwinbinsyllables.exe". Stop.

$(OUT)%.o: $(ROOT)src%.c gcc $(CFLAGS) -o $@ -c $<

$(OUT)binsyllables.exe: $(OUT)LinkedList.o $(OUT)Syllable.o $(OUT)Model.o gcc $(CFLAGS) -o $@ $^

$ (OUT) sollte auf erweitern <root>outwin Mit der Akte beschwert sie sich über ein klares Ziel. Ich verstehe nicht, warum diese Regel nicht funktioniert, da dieselbe Regel unter Unix gut funktioniert. Gibt es eine unbestimmte Regel über maximale Verzeichnisse in Zielen oder so etwas? Ich habe nicht genug Erfahrung mit make, um wirklich einschätzen zu können, was hier schief läuft.

Hier ist der vollständige Text der betreffenden Datei: https://github.com/blastedt/syllables/blob/master/makefile.win

Antworten:

0 für die Antwort № 1

$(OUT)%.o: Definiert keine Musterregel entkam das %.

$(OUT)\%.o: In diesem Fall sollte es funktionieren, obwohl es wegen solcher Gechts so ist, dass es am besten ist, Backslashes zu vermeiden, wenn make unter Windows verwendet wird.

Sie werden auf Probleme mit Shell-Befehlen wie z mkdir und del Wenn Sie nicht mit Schrägstrichen arbeiten, sollten Sie die Umschaltung auf Powershell, Cygwin, MSYS2 oder Schlag auf Fenster.