2016-03-01 2 views
1

Я скомпилировал свой код с указанным флагом -std=c++11, и я получаю всевозможные ошибки, изображающие, что я должен использовать один и тот же флаг. Кроме того, auto не распознается как тип.G ++, похоже, не распознает -std = C++ 11

Makefile:

GCCPATH = /path/gcc/5.3.0 
CC = $(GCCPATH)/bin/g++ 
DARGS = -ggdb    #debug arguments 
CARGS = -std=c++11   #C arguments 
WARGS = -Wall -Wextra  #warning arguments 
AARGS = $(DARGS) $(CARGS) $(WARGS) #all arguments 
GCCLIBPATH = $(GCCPATH)/lib64 
LIBS = -l curl 
LIBD = -L $(GCCLIBPATH) -Wl,-rpath=$(GCCLIBPATH) 

.PHONY: webspider 

webspider: ../title/htmlstreamparser.o filesystem.o 
    $(CC) $(AARGS) -o [email protected] [email protected] $+ $(LIBS) $(LIBD) 

filesystem: 
    $(CC) $(AARGS) -c [email protected] 

Предупреждения и ошибки я получаю:

warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 
warning: range-based ‘for’ loops only available with -std=c++11 or -std=gnu++11 
error: ‘weblink’ does not name a type 
    for(auto weblink: weblinks) 

Теперь мой вопрос: Что я должен сделать, чтобы сделать г ++ признать это ясно данный флаг?
Я также попытался заменить его -std=c++0x, но безрезультатно.

EDIT:
Полный выход make:

g++ -c -o filesystem.o filesystem.cpp 
In file included from filesystem.cpp:1:0: 
filesystem.hpp:23:36: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 
    std::string dir = getCurrentPath(); 
            ^
filesystem.cpp: In member function ‘std::__cxx11::string Filesystem::createMD5(std::__cxx11::string)’: 
filesystem.cpp:49:19: warning: range-based ‘for’ loops only available with -std=c++11 or -std=gnu++11 
    for(long long c: result) 
       ^
filesystem.cpp: In member function ‘void Filesystem::createLinkIndex(std::__cxx11::string, strVec)’: 
filesystem.cpp:57:11: error: ‘weblink’ does not name a type 
    for(auto weblink: weblinks) { 
     ^
filesystem.cpp:61:1: error: expected ‘;’ before ‘}’ token 
} 
^ 
filesystem.cpp:61:1: error: expected primary-expression before ‘}’ token 
filesystem.cpp:61:1: error: expected ‘;’ before ‘}’ token 
filesystem.cpp:61:1: error: expected primary-expression before ‘}’ token 
filesystem.cpp:61:1: error: expected ‘)’ before ‘}’ token 
filesystem.cpp:61:1: error: expected primary-expression before ‘}’ token 
make: *** [filesystem.o] Error 1 
+6

Разве у вас нет 'CXXFLAGS = -std = C++ 11'? – NathanOliver

+0

Вы видите, если флаг передан gcc и просто не распознан, или если на самом деле проблема с make-файлом? – Anedar

+0

@NathanOliver Это было то, что я собирался сказать ... – callyalater

ответ

5

Проблема заключается не указать все зависимости, в частности, как построить все промежуточные объектные файлы.

Итак, что происходит, make составляет свои собственные правила и незаметно пробирает их, пока вы не смотрите.

Способ управления этой implicit rules через установление правильного predefined variables:

CXX := $(GCCPATH)/bin/g++  # c++ compiler 
CPPFLAGS := -I/path/to/headers # preprocessor flags 
CXXFLAGS := -std=c++11   # compiler flags 
LDFLAGS := -L/path/to/libs  # linker flags 
LDLIBS := -lcurl    # libraries to link 
# etc... 

Используя правильные предопределенных переменные, а не составляя свой собственный, вы можете сэкономить много работы при строительстве Makefile.

+1

Принимается не потому, что это был ответ, который мне больше всего помог, а потому, что это ответ, который поможет людям в целом больше всего. –

0

В конце концов, на основе замечаний, оно было зафиксировано изменение

filesystem: 
    $(CC) $(AARGS) -c [email protected] 

в

filesystem.o: filesystem.cpp 
    $(CC) $(AARGS) -c $+ 

в Makefile не понял, что я пытался сделать filesystem.o с правилом filesystem: .... Указав это явно, он работал по назначению.

Преимущество этого метода в ответе Галика - возможность использовать собственные переменные, хотя в этом случае не так много преимуществ, поскольку это небольшой проект.

Смежные вопросы