2016-03-01 99 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) 

現在我的問題是:我應該怎麼做才能讓G ++認識到這一點清楚地定標誌?
我也試圖用-std=c++0x替換它,沒有用。

編輯:
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並且只是無法識別,或者它實際上是否與makefile有關? – 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: ...。當明確說明這一點時,它按預期工作。

這個方法優於Galik的答案是使用自己的變量的能力,雖然在這種情況下,由於它是一個小項目,所以沒有那麼多優勢。