2012-02-13 132 views
5

我剛開始學習Linux,在禁用GCC對我的一個C++項目進行優化時遇到了一些麻煩。如何在使用makefile時禁用GCC優化?

該項目建有像這樣的makefile ...

make -j 10 && make install 

我已經在該命令禁用優化是沿東西線各個站點讀取...

gcc -O0 <your code files> 

有人能幫我申請makefile而不是個人代碼嗎?我一直在尋找幾個小時,空手而歸。

+10

這將很難提出對Makefile的編輯,我們無法看到 – sehe 2012-02-13 14:49:54

+0

如果不指定優化級別,則-O0是默認值。您可能希望使用-g標誌,因爲這會生成調試符號。 – 2012-02-13 15:47:16

+0

對不起,遲到了,我一直很忙。這裏的生成文件之一:http://pastebin.com/ftvXEFbv – inline 2012-02-14 13:58:21

回答

5

在一些標準的makefile設置,你可以

make -j10 -e CPPFLAGS=-O0 

但是makefile文件可能會使用其他替代變量或重寫環境。您需要向我們展示了Makefile文件,以便提出修改

+5

'CPPFLAGS'往往代表C預處理器標誌,'CXXFLAGS'是C++編譯器的標誌。 – Fanael 2012-02-13 14:57:06

+0

@Fanael雖然這可能是真的,但通常會將「CPPFLAGS」添加到「CXXFLAGS」和「CFLAGS」中,這使得它成爲更一般的入口點。 – sehe 2012-02-13 15:14:38

+0

@Fanael:對於C++文件的默認規則是'$(CXX)-c $(CPPFLAGS)$(CXXFLAGS)' – 2012-02-13 15:22:52

0

例如,一個優化的編譯可以寫成:

all: 
    g++ -O3 main.cpp 

與調試信息(無優化)的彙編可以寫爲:

all: 
    g++ -g main.cpp 
+0

沒有人寫這樣的makefile。事實上,你甚至不需要一個文件,只需鍵入'make main' – 2012-02-13 15:03:52

+0

當然,這不是一個可用的makefile。只是如何啓用/禁用優化的最簡單示例。 – rasmus 2012-02-13 15:05:52

3

最簡單的(有用)生成文件,其允許調試/釋放模式是:

# 
# Define the source and object files for the executable 
SRC  = $(wildcard *.cpp) 
OBJ  = $(patsubst %.cpp,%.o, $(SRC)) 

# 
# set up extra flags for explicitly setting mode 
debug:  CXXFLAGS += -g 
release: CXXFLAGS += -O3 

# 
# Link all the objects into an executable. 
all: $(OBJ) 
    $(CXX) -o example $(LDFLAGS) $(OBJ) $(LOADLIBES) $(LDLIBS) 

# 
# Though both modes just do a normal build. 
debug:  all 
release: all 

clean: 
    rm $(OBJ) 

使用默認版本(未指定優化)

> make 
g++ -c -o p1.o p1.cpp 
g++ -c -o p2.o p2.cpp 
g++ -o example p1.o p2.o 

用法:發佈版本(採用-O3)

> make clean release 
rm p1.o p2.o 
g++ -O3 -c -o p1.o p1.cpp 
g++ -O3 -c -o p2.o p2.cpp 
g++ -o example p1.o p2.o 

用法:調試版本(使用-g)

> make clean debug 
rm p1.o p2.o 
g++ -g -c -o p1.o p1.cpp 
g++ -g -c -o p2.o p2.cpp 
g++ -o example p1.o p2.o 
+0

請注意,當指定了除debug或release之外的目標時,您的目標特定變量將不起作用。更強大的方法是http://stackoverflow.com/a/5153406/412080 – 2012-02-13 15:32:22

+0

@MaximYegorushkin:它沒有指定目標工作正常。它被設計成當你沒有指定任何東西時不使用變量。它將使用構建代碼的第一條規則'all'。 **如上所示**。我認爲你鏈接的makefile也沒有優勢。這絕對不是**更強大。它只是使用不同的技術做同樣的事情(除非你指定了默認的-g(這不是我想要的))。 – 2012-02-13 15:36:06

+0

對,'make this'只適用於'make','make debug'和'make release'。 – 2012-02-13 15:39:12