2012-02-13 15 views
5

मैंने अभी लिनक्स सीखना शुरू कर दिया है और मुझे मेरी सी ++ परियोजनाओं में से किसी एक के लिए जीसीसी के अनुकूलन को अक्षम करने में कुछ परेशानी हो रही है।मेकफ़ाइल का उपयोग करते समय मैं जीसीसी अनुकूलन को कैसे अक्षम करूं?

परियोजना इतनी तरह makefiles के साथ बनाया गया है ...

make -j 10 && make install 

मुझे लगता है कि आदेश को निष्क्रिय करने के अनुकूलन की तर्ज पर कुछ है विभिन्न साइटों पर पढ़ा है ...

gcc -O0 <your code files> 

कोई व्यक्ति कृपया मुझे व्यक्तिगत कोड के बजाय मेकफ़ाइल पर लागू करने में मदद कर सकता है? मैं घंटों की तलाश कर रहा हूं और खाली हाथ आया हूं।

+10

यह जा रहा है मेकफ़ाइल में संपादन का प्रस्ताव देना मुश्किल है कि हम – sehe

+0

-O0 डिफ़ॉल्ट नहीं देख सकते हैं यदि आप अनुकूलन स्तर निर्दिष्ट नहीं करते हैं। आप -g ध्वज का उपयोग करना चाह सकते हैं क्योंकि यह डीबग प्रतीकों उत्पन्न करता है। –

+0

देर से उत्तर के लिए खेद है, मैं काफी व्यस्त हूं। मेकफ़ाइल में से एक यहां है: http://pastebin.com/ftvXEFbv – inline

उत्तर

5

कुछ मानक makefile सेटिंग में आप कर सकते थे

make -j10 -e CPPFLAGS=-O0 

लेकिन makefile अन्य प्रतिस्थापन चर का उपयोग या पर्यावरण को ओवरराइड कर सकते हैं। आपको संपादन

+5

'CPPFLAGS' अक्सर सी प्रीप्रोसेसर झंडे के लिए खड़ा होता है, 'CXXFLAGS' C++ कंपाइलर के लिए झंडे हैं। – Fanael

+0

@Fanael जबकि यह सच हो सकता है, 'सीपीपीएफएलजीएस' आमतौर पर 'CXXFLAGS' और 'CFLAGS' में जोड़ा जाता है जो इसे अधिक सामान्य प्रविष्टि बिंदु बनाता है। – sehe

+0

@Fanael: C++ फ़ाइलों के लिए डिफ़ॉल्ट नियम '$ (CXX) -c $ (CPPFLAGS) $ (CXXFLAGS)' –

0

उदाहरण के लिए प्रस्ताव करने के लिए में Makefile दिखाने की जरूरत है, एक अनुकूलित संकलन के रूप में लिखा जा सकता है:

all: 
    g++ -O3 main.cpp 

डिबग जानकारी (कोई अनुकूलन) के साथ एक संकलन लिखा जा सकता है के रूप में:

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

कोई भी इस तरह एक मेकफ़ाइल लिखता है। वास्तव में आपको इसके लिए एक फ़ाइल की भी आवश्यकता नहीं है, बस 'मुख्य बनाएं' –

+0

टाइप करें, बेशक, यह उपयोग करने योग्य मेकफ़ाइल नहीं है।ऑप्टिमाइज़ेशन को सक्षम/अक्षम करने का एक न्यूनतम उदाहरण। – rasmus

3

सरल (उपयोगी) makefile कि डिबग/रिलीज मोड की अनुमति देता है:

# 
# 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 

उपयोग: डीबग बिल्ड (जी का उपयोग करता है)

> 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

नोट, कि आपका लक्ष्य विशिष्ट चर काम नहीं करेगा जब 'डीबग' या 'रिलीज' के अलावा कोई लक्ष्य निर्दिष्ट होगा। एक और मजबूत तरीका http://stackoverflow.com/a/5153406/412080 –

+0

@MaximYegorushkin: यह निर्दिष्ट लक्ष्य के साथ ठीक काम करता है। जब आप कुछ निर्दिष्ट नहीं करते हैं तो यह किसी चर का उपयोग करने के लिए डिज़ाइन नहीं किया गया है। यह पहले नियम 'सब' का उपयोग करेगा जो सिर्फ कोड बनाता है। **ऊपर दिखाये अनुसार**। मुझे आपके द्वारा लिंक किए गए मेकफ़ाइल पर कोई फायदा नहीं होता है। यह निश्चित रूप से ** अधिक ** मजबूत नहीं है। यह एक अलग तकनीक का उपयोग करके वही काम करता है (सिवाय इसके कि जब तक आप कुछ निर्दिष्ट नहीं करते हैं -g (जो मैं नहीं चाहता))। –

+0

ठीक है, यह 'इसे बनाने' के लिए काम नहीं करेगा, केवल 'मेक' के लिए, 'डीबग करें' और 'रिलीज करें'। –

संबंधित मुद्दे