2013-05-08 168 views
2

我正在學習makefile。我試過的是在閱讀一小段文字後寫下自己的一本。問題是,即使我把需要的編譯器標誌放到makefile中,我總會得到與C++ 11標準相關的錯誤。以下是錯誤:Makefile C++ 11錯誤

/usr/include/c++/4.6/bits/c++0x_warning.h:32:2: error: 
#error This file requires compiler and library support for the upcoming 
ISO C++ standard, C++0x. This support is currently experimental, and 
must be enabled with the -std=c++0x or -std=gnu++0x compiler options. 

這裏是生成文件:

CC = g++ 
LD = g++ 

NAME = app 
OBJ_DIR = obj 
SRC_DIR = src 

CXX_FLAGS = -std=c++0x 

SRC = $(shell find $(SRC_DIR) -type f -regex ".*\.cpp") 
OBJ = $(subst $(SRC_DIR), $(OBJ_DIR), $(addsuffix .o, $(basename $(SRC)))) 

all: $(NAME) 

$(NAME): $(OBJ) 
    $(LD) $< -o [email protected] $(CXX_FLAGS) 

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp 
    $(CC) $< -o [email protected] $(CXX_FLAGS) 

clean: 
    rm $(NAME) $(OBJ_DIR) -rf 

請注意,我已經把CXX_FLAGS檢查出的堆棧溢出的其他問題後,但無濟於事。我仍然得到同樣的錯誤。這就像make忽略我的國旗。有針對這個的解決方法嗎?

是的,我可以用-std = C++ 0x標誌編譯而不make,所以我的編譯器顯然不是問題。

+0

'make'應該在執行時輸出每條命令。什麼'g ++'調用立即出現在錯誤之前? – cdhowie 2013-05-08 15:54:20

+0

@cdhowie g ++ -c -o src/normal.o src/normal.cpp 它看起來像忽略我的國旗。 – darxsys 2013-05-08 15:55:28

+0

所以這個問題根本不在C++ 11標誌中。你的實際問題是「爲什麼我的makefile規則不被使用」。如果是這樣的話,我希望該行是'g ++ src/normal.c -o obj/normal.o -std = C++ 0x' – cdhowie 2013-05-08 15:56:15

回答

1

目錄obj是否存在?

一種更好的方式來寫,這將是:

OBJ = $(patsubst $(SRC_DIR)/%.cpp,$(OBJ_DIR)/%.o,$(SRC)) 

您可以將這些行之後添加$(info OBJ = $(OBJ))等打印出來。基本上這些操作的結果與您的模式規則不匹配,因此make使用默認模式規則。

雖然我強烈勸阻這種事(使用find)。我總是輸入我想編譯的源文件。添加一個新文件的時間不會超過幾秒鐘,並且可以確保在您最不期望的時候,不會隨機向您的程序投擲垃圾。

你的編譯命令也是錯誤的:你忘記了-c這個標誌很重要。我建議人們只是用相同的命令作爲默認規則(運行make -p -f/dev/null看到默認的規則):

$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp 
     $(COMPILE.cc) $(OUTPUT_OPTION) $< 

這並不需要您使用標準的標誌變量(即CXXCCCXXFLAGSCXX_FLAGS ),但無論如何這是個好主意。

+0

Man,this worked.Th對此建議anks !!! – darxsys 2013-05-08 16:41:51

1

它實際上並沒有使用你的規則來構建目標文件。註釋掉,你會發現它仍然調用「g ++ -c」。

問題的一部分是,用於定義OBJ的命令subst將其參數解釋爲文字。把它改寫爲

OBJ = $(subst src, obj, $(addsuffix .o, $(basename $(SRC)))) 

你至少會得到想要的OBJ。

+0

爲什麼?我該如何改變它? – darxsys 2013-05-08 16:17:59

+0

行定義OBJ不能正常工作......仍然試圖弄清楚爲什麼 – Clark 2013-05-08 16:27:30

+0

這真的很有趣,做完之後,我得到: make:***沒有規則可以讓目標'obj/normal.o' 'app'。Stop。 – darxsys 2013-05-08 16:39:16

1

在行的末尾有空格,定義了SRC_DIROBJ_DIR。這意味着subst不會做任何事情,因爲它正在尋找"src "而不是"src"

反過來,這意味着它將嘗試構建src/whatever.o而不是obj/whatever.o,並且由於沒有規則,它將回退到默認規則而不是您的規則。

解決該問題後,您需要將-c添加到編譯命令中,以生成目標文件而不是可執行文件。

+0

是的,這是一個關鍵問題。定義obj_dir和src_dir的空間 – darxsys 2013-05-10 21:21:28