2016-04-04 17 views
-2

Siehe das Bild, ich wollte Ordner in Makefile für c-Projekt unter Windows 10 erstellen. In der letzten Zeile habe ich versehentlich "#" hinzugefügt, und es funktioniert. Es funktioniert jedoch nicht ohne das "#" in der letzten Zeile.

Diese Linie ist wie folgt:

mkdir -p [email protected] 

oder

mkdir -p [email protected] # 
  1. Warum es ohne "#" nicht funktionieren?
  2. Wie schreibe ich es richtig unter Windows 10?

Edit: Fehlermeldung in kurzen Fehlermeldung das System kann die angegebenen Dateien nicht finden (es ist ein translattion)

making dirs.... 
build/ 
mkdir -p build/ 
Makefile:293: recipe for target 'build/' failed 
process_begin: CreateProcess(NULL, mkdir -p build/, ...) failed. 
make (e=2): Das System kann die angegebene Datei nicht finden. 

make: *** [build/] Error 2 

Edit: ich den Code in Text hinzufügen wie folgt

+2

Bitte beschreiben Sie genauer, was „nicht funktioniert“. Das heißt, beschreiben Sie das erwartete Verhalten und das tatsächliche Verhalten. Bitte verwenden Sie auch keine Bilder für Text. Kopieren Sie den Text direkt als Text in die Frage. – kaylum

+1

'mkdir -p' ist ein U \ * x-Befehl. Es sei denn, Sie irgendeine Art von U \ * x Userland haben (Cygwin, Bash, usw.) es wird einfach nicht funktionieren, so wie 'cmd/c beginnen notepad.exe' ist unwahrscheinlich, etwas Sinnvolles auf Nicht-Windows-Plattformen zu tun. – tripleee

+0

kaylum. es funktioniert nicht, machen Sie es zu einem Fehler und hört dort auf. –

Antwort

0

mkdir nicht die -p Parameter, also entfernen Sie es. Außerdem müssen Backslashes anstelle von Schrägstrichen ersetzt werden.

So ist der Befehl, den Sie statt Ihres aktuellen mkdir zu verwenden ist:

mkdir $(subst /,\,[email protected]) 

Edit:

Im unwahrscheinlichen Fall, CMD Befehlserweiterungen sind standardmäßig deaktiviert, müssen Sie stattdessen diesen Befehl verwenden :

cmd /E:ON /C mkdir $(subst /,\,[email protected]) 
+0

Danke, ich habe beides ausprobiert. Aber nichts davon funktioniert! Außerdem benutze ich GNU Make 4.1 Build für i686-w64-mingw32. –

+0

@Jay S Haben Sie lustige Fehler wie 'gmake erhalten: Interrupt/Ausnahme gefangen (code = 0xc0000005, addr = 0x000007FEFEF82020)' – jdarthenay

+0

Nö. mit dem Zusatz von #, es funktioniert Präfekt. –

0

ich hatte genau das gleiche Problem und dank der temporäre Lösung, es endete arbeiten. Allerdings habe ich ein wenig mehr gegraben und herausgefunden, was zumindest vor sich geht. Wenn Sie

make --debug=j 

laufen werden Sie sehen, dass, wenn Sie den # Charakter hinzufügen, make läuft eigentlich

mkdir _build # 
CreateProcess(NULL,C:/Program Files/GNU ARM Eclipse/Build Tools/2.6-201507152002/bin/sh.exe -c "mkdir _build #",...) 

Es sollte eigentlich Sinn, dass dies nur funktioniert, wie mkdir nicht eine tatsächliche ausführbare Datei ist in Windows, aber ein Befehl interpretiert nur innerhalb einer Windows-Shell. Ich habe etwas durch den Quellcode make (für Win32) gegraben, und es scheint, als ob es ziemlich viel hardcoded Logik für die Entscheidung, welche Befehle sh durchlaufen und welche Befehle versuchen, als ein Prozess zu starten. Ich bin nicht dazu gekommen, herauszufinden, welcher Anwendungsfall das #-Symbol plötzlich dazu veranlasst, mkdir in die Shell zu füttern, anstatt zu versuchen, den Prozess zu starten, aber Sie haben drei Möglichkeiten, um das "richtig" zu machen:

1) Verwenden Sie eine ausführbare Datei mkdir, wie die in CoreUtils für Windows: http://gnuwin32.sourceforge.net/packages/coreutils.htm. Stellen Sie sicher, dass es natürlich in Ihrem Weg ist.

2) Ändern Sie den mkdir-Befehl in cmd /c "mkdir [email protected]", was mkdir an den nativen Befehlshandler in Windows liefern würde. In meinem Fall verwende ich nicht das -p Flag, also ist es kompatibel mit dem Windows mkdir, aber in Ihrem Fall wird -p nicht von der nativen Windows-Shell unterstützt, so dass Sie entweder eine leistungsfähigere Shell (sh) oder verwenden müssen siehe # 1.

3) durch die make Quellcode lesen und sehen, ob es zu diesem Verhalten aus irgendeinem Grund ist, oder wenn es ein Bug. Ich habe das Handbuch durchsucht, und ich glaube nicht, dass die Art, wie Sie Ihren Befehl an die Shell senden oder ihn öffnen, als ein Prozess dokumentiert ist.