makefile funktioniert nicht mit -std=c++11-option
Ich versuche zu spielen, mit einigen C++11 Funktionen mit g++ 4.8.2 mit dem folgenden makefile
CC=g++
DEBUG=-g
CFLAGS=-c -Wall -std=c++11 $(DEBUG)
LFLAGS = -Wall -std=c++11 $(DEBUG)
SOURCES=test.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=test
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LFLAGS) $(OBJECTS) -o $@ -std=c++11
.cpp .o:
$(CC) $(CFLAGS) $< -o $@ -std=c++11
clean:
rm -rf *o $(EXECUTABLE)
Aber wenn ich den Aufruf von "make", hier ist die Fehlermeldung die ich bekomme,
$ make
g++ -c -o test.o test.cpp
test.cpp: In function ‘int main()’:
test.cpp:18:15: error: range-based ‘for’ loops are not allowed in C++98 mode
for (int i : {2, 3, 5, 7, 9, 13, 17, 19})
^
make: *** [test.o] Error 1
Es scheint mir, dass -std=c++11 nicht abgeholt, also habe ich versucht zu werfen, dass die option im Bündel von verschiedenen Orten, aber immer noch gleiche Fehler Auftritt.
Aktuelle Lösung ist die Verwendung Kommandozeilen-direkt, und das funktioniert für mich
$ cat test.cpp
#include <iostream>
using namespace std;
int main()
{
cout << "Hello World" << endl;
for (int i : {2, 3, 5, 7, 9, 13, 17, 19})
{
cout << i << " ";
}
cout << endl;
return 0;
}
$ g++ -std=c++11 test.cpp -o test -W
$ ./test
Hello World
2 3 5 7 9 13 17 19
Ich Frage mich nur, warum makefile nicht tun, die gleiche Sache, und wie könnte ich die update-makefile zu verwenden,- std=c++11-option.
-std
wird zweimal, in CFLAGS und direkt in der Regel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es verschiedene Probleme mit dem makefile, aber das wichtigste scheint zu sein, dass die Regel für die Erstellung von Objekten aus
.cpp
- Dateien ist falsch. Müssen Sie etwas entlang der Linien vonAuf der anderen Seite könnte es leichter sein, Sie zu nutzen
make
's implizite Regeln, und legen SieCXXFLAGS
,CXX
etc. Legen Sie beispielsweiseund entfernen Sie die
%.o
Regel, lassen, machen, tun, seine Sache. Beachten Sie, dassCC
undCFLAGS
werden in der Regel verwendet für C-code.Ich denke, den Raum in Ihrem
.cpp .o:
Regel ist verwirrend machen. Aber ich gehe mit @juanchopanza Empfehlung und wechseln auf die neuere pattern syntax - es ist viel mehr klar.