2014-12-12 8 views
6

संकलन झंडे तक पहुंचने के लिए एक तरीका है (उदाहरण के लिए, परिभाषित स्थिरांक) जिसके साथ संकलक संकलित किए जा रहे कोड के अंदर संकलक चलाया गया था।जी ++: संकलित किए जा रहे कोड के अंदर संकलन झंडे तक पहुंचने का कोई तरीका है?

उदाहरण के लिए, मुझे एक ऐसा प्रोग्राम चाहिए जो झंडे लिखता है जिसके साथ इसे संकलित किया गया था।

int main(){ 
    std::cout << COMPILE_FLAGS << std::endl; 
} 

क्या ऐसे स्थिरांक जीसीसी/जी ++ के लिए मौजूद हैं? या इससे भी बेहतर: क्या वहां स्थिरांक हैं जिन्हें जीसीसी और क्लैंग दोनों में परिभाषित किया गया है?

मैं विशेष रूप से अनुकूलन स्तर और -march ध्वज के मूल्य की जांच करने में रूचि रखता हूं। इसलिए, यदि कोई स्थिरांक नहीं है जो सभी झंडे दिखाता है, तो कम से कम वे हैं जो इन मानों को प्रदर्शित करते हैं?

+0

यदि कुछ और नहीं है, तो आप एक मेकफ़ाइल का उपयोग करके एक साथ कुछ हैक करने में सक्षम होना चाहिए जो एक साथ ऑप्टिमाइज़ेशन ध्वज सेट करता है, और एक हेडर फ़ाइल को स्थिर करता है। – Degustaf

+0

मैं कोड के साथ संग्रहीत डीबग जानकारी में इसे देखने की कोशिश करता हूं, अगर यह ऐसी जानकारी के साथ संकलित है। आम तौर पर मैं कहूंगा कि कोई रास्ता नहीं है, क्योंकि हम मशीन कोड को संकलित करते हैं, और ज्यादातर मामलों में रन-टाइम पर यह पूरी तरह से अनावश्यक जानकारी होगी। मेरा मतलब है कि अधिकांश झंडे प्रभाव डालते हैं कि मशीन-निर्देश चुने जाते हैं और कौन सा अनुकूलन किया जा सकता है, ताकि आप मशीन-कोड से कुछ झंडे को कम कर सकें। – midor

उत्तर

1

निम्न आदेश प्रिंट बाहर सभी पूर्व-निर्धारित मैक्रो:

g++ -dM -E - < /dev/null 

यह दोनों जीसीसी और जी ++ के साथ काम करता है। आप स्वयं को जांच सकते हैं - दुर्भाग्यवश, कोई मैक्रो नहीं है, जो पूर्ण जीसीसी/जी ++ कमांड लाइन तक आसान पहुंच प्रदान करता है।

सौभाग्य से, अधिकांश -m ... झंडे के परिणामस्वरूप पर्याप्त प्रीकंपलर मैक्रोज़ परिभाषित किए जाएंगे। उदाहरण के लिए, -m64 को परिभाषित करता है __x86_64 और -m32 को परिभाषित करता है __code_model_32__। या -मार्च: -मार्च = कोर-एवीएक्स 2 परिणाम #define __core_avx2__ 1

बस उस विकल्प को जोड़ें, जिसे आपको ऊपर की कमांड लाइन पर जांचने की आवश्यकता है, और नए मैक्रो परिभाषा के परिणाम की जांच करें।

0

आप संकलन झंडे या स्क्रिप्ट है कि संकलन आदेश उत्पन्न करता है बदलने में सक्षम हैं, तो आप एक -DCOMPILE_FLAGS = < झंडे आप में रुचि रखते हैं> अपने निर्माण करने के लिए वास्तव में है कि निरंतर बनाने के लिए जोड़ सकते हैं।

GCC manual से:

डी नाम = परिभाषा परिभाषा की सामग्री tokenized और प्रसंस्कृत रूप में यदि वे एक '#define' निर्देश में अनुवाद तीन चरण के दौरान दिखाई दिया जाता है। विशेष रूप से, परिभाषा को नए पेपर द्वारा को छोटा कर दिया जाएगा।

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

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