जीसीसी के साथ पूर्व मुखिया


91

किसी को भी जीसीसी के साथ काम कर रहे पूर्व मुखिया बनने में कोई सफलता मिली? मुझे अपने प्रयासों में कोई भाग्य नहीं था और मैंने इसे स्थापित करने के कई अच्छे उदाहरण नहीं देखे हैं। मैंने cygwin gcc पर 3.4.4 और Ubuntu पर 4.0 का उपयोग करने की कोशिश की है।


मैंने इसकी कोशिश की और मेरे पास पहले से तैयार हेडर के लिए इष्टतम उपयोग का मामला था क्योंकि मेरा सी स्रोत संकलित है और उपयोगकर्ता द्वारा लिखित नहीं है। सन स्टूडियो और विशेष रूप से विजुअल स्टूडियो ने बिल्ड टाइम में बहुत सुधार किया। Gcc पर यह तब और भी खराब हो रहा था जब बिना पूर्वगामी हेडर के। यह 3.4 के साथ था। 4.x के साथ टेस्टसेट नहीं है, लेकिन गति और जीसीसी पारस्परिक रूप से अनन्य है।
लोथर नोव

@ लतार क्या कोड था? मुझे लगता है कि कुछ भारी टेम्प्लेटेड कोड पर हाल के विज़ुअल स्टूडियो संकलक की तुलना में g ++ लगभग 10x तेज है।
सूअर

मैं अपने C ++ कोड में टेम्प्लेट का उपयोग नहीं कर रहा हूं। यह सिर्फ C + अपवाद हैंडलिंग + अच्छा C ++ एक्सटेंशन है। अब भी इस सवाल के 6 साल बाद VS2010 तेजी से बढ़ा है। लेकिन इस बीच मेरे पास 16 कोर हैं इसलिए मैं इसके साथ रह सकता हूं।
लोथर नोव

जवाबों:


58

मुझे निश्चित रूप से सफलता मिली है। सबसे पहले, मैंने निम्नलिखित कोड का उपयोग किया:


#include <boost/xpressive/xpressive.hpp>
#include <iostream>

using namespace std;
using namespace boost::xpressive;

//A simple regex test
int main()
{
    std::string hello( "hello world!" );

    sregex rex = sregex::compile( "(\\w+) (\\w+)!" );
    smatch what;

    if( regex_match( hello, what, rex ) )
    {
        std::cout << what[0] << '\n'; // whole match
        std::cout << what[1] << '\n'; // first capture
        std::cout << what[2] << '\n'; // second capture
    }
    return 0;
}

यह बूस्ट एक्सपेक्टिव (लिंक के लिए नीचे देखें) से सिर्फ एक हैलो दुनिया थी। सबसे पहले, मैंने -Hजीसीसी में विकल्प के साथ संकलित किया । इसने हेडर की एक विशाल सूची दिखाई जो इसका उपयोग करता था। फिर, मैंने अपने आईडीई (कोड :: ब्लॉक) के संकलन झंडों पर एक नज़र डाली और कुछ इस तरह देखा:

g++ -Wall -fexceptions -g -c main.cpp -o obj/Debug/main.o

इसलिए मैंने Xpressive.hpp फ़ाइल को ठीक उसी झंडे के साथ संकलित करने के लिए एक कमांड लिखा:

sudo g++ -Wall -fexceptions -g /usr/local/include/boost/xpressive/xpressive.hpp

मैंने मूल कोड को फिर से संकलित किया -Hऔर यह आउटपुट प्राप्त किया:

g ++ -all -fexception -H -g -c main.cpp -o obj / Debug / main.o
! /usr/local/include/boost/xpressive/xpressive.hpp.gch
main.cpp
। /usr/include/c++/4.4/iostream
।।/usr/include/c+/4.4/x86_64-linux-gnu/bits/c++config.h
../usr/include/c++/4.4/ostream
../usr/include/c++/4.4/istream
main.cpp

! इसका मतलब है कि कंपाइलर प्रीकंपल्ड हेडर का उपयोग करने में सक्षम था। एक एक्स का मतलब है कि वह इसका उपयोग करने में सक्षम नहीं था। उपयुक्त संकलक झंडे का उपयोग करना महत्वपूर्ण है। मैंने -एच को उतार दिया और कुछ गति परीक्षण चलाए। Precompiled हेडर में 14 सेकंड से 11 सेकंड तक सुधार हुआ था। बुरा नहीं है, लेकिन अच्छा भी नहीं है।

नोट: यहाँ उदाहरण के लिए लिंक है: http://www.boost.org/doc/libs/1_43_0/doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.examples मैं इसे काम करने के लिए नहीं प्राप्त कर सका। पद।

BTW: मैं निम्नलिखित g ++ का उपयोग कर रहा हूं

g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3


20
जोड़ना -Winvalid-pch आपको डिबग करने में मदद करेगा कि क्या और क्यों PCH के उपयोग में कुछ भी गलत हुआ है।
बायीं ओर

"बुरा नहीं है, लेकिन महान नहीं" precompiled हेडर उपयोगी होते हैं जब आपके पास कई हेडर होते हैं जो एक दूसरे को रिलेक्स करते हैं, इसलिए वे बहुत बड़े प्रोजेक्ट पर संकलन समय को कम कर देंगे जो कि बड़े पुस्तकालयों या कई पुस्तकालयों का उपयोग करते हैं।
जोक

4
"बुरा नहीं है, लेकिन महान नहीं है": gcc 4.4.7, 136 .cpp फ़ाइलों का उपयोग करके 35.5 एमबी कुल आकार, 148 .h फाइलें 5.5 एमबी कुल आकार। .gch फ़ाइल 48 एमबी है, डीबग बिल्ड 2'20 लेता है "(बनाम 2) '14 "गैर-पंच), -ओ 2 अनुकूलित निर्माण में 4'30 लगते हैं" (बनाम 5'33 "गैर-पंच) प्रभाव डिबग बिल्ड के पास की उम्मीद की जाएगी, लेकिन यह सिर्फ अनुकूलित निर्माण है जो precompiling से लाभ है ...। यकीन नहीं है कि क्यों। Precompiling तरीका अधिक विंडोज पर नाटकीय है!
एंड्रियास वेर्गिसन

1
(cont'd) Pch / गैर-pch आउटपुट फ़ाइलों के अनुरूप, बिल्कुल उसी आकार की बाइट होती है, जो अच्छी है। उपरोक्त समय में बिल्ड्स को दोहराते समय भिन्नता प्रतीत होती है, उदाहरण के लिए -O2 नॉन-पीच 3'45 "और 5'33" के बीच भिन्न होता है, इसलिए यह सटीक विज्ञान नहीं है, शायद VMware में चलने के कारण। वैसे भी, जीसीसी pch मेरे मामले में बिल्कुल भी फायदेमंद नहीं दिखता है। इसकी तुलना विंडोज VS2012 (x64, सिंगल थ्रेडेड कंपाइल) पर समान कोड बेस से करें: डिबग 46 "pch, 2'50" नॉन-pch, रिलीज़ 2'13 "pch, 5'02" नॉन-pch। और बहु-प्रोसेसर को सक्षम करते समय निश्चित रूप से बहुत तेज ...
एंड्रियास वेर्गिसन

@AndreasVergison - क्या आपने -Winvalid-pchयह सुनिश्चित करने के लिए उपयोग करने की कोशिश की है कि पहले से तैयार हेडर का सही इस्तेमाल हो रहा है? हम अपने डिबग बिल्ड के लिए pch का उपयोग करके एक बड़े सुधार को देखते हैं, इसलिए मुझे आश्चर्य है कि अगर आपके सेटअप में कोई समस्या है।
जोश केली

52

सबसे पहले, यहां प्रलेखन देखें

आप हेडर को किसी अन्य फ़ाइल की तरह संकलित करते हैं, लेकिन आप आउटपुट को फ़ाइल के अंदर एक प्रत्यय के साथ रखते हैं .gch

इसलिए उदाहरण के लिए यदि आप stdafx.h को precompile करते हैं। आपके पास एक precompiled हेडर होगा जो स्वचालित रूप से stdafx.h.gchकिसी भी समय कॉल करने के लिए खोजा जाएगा।stdafx.h

उदाहरण:

stdafx.h:

#include <string>
#include <stdio.h>

a.cpp:

#include "stdafx.h"
int main(int argc, char**argv)
{
  std::string s = "Hi";
  return 0;
}

फिर संकलन करें:

> g++ -c stdafx.h -o stdafx.h.gch
> g++ a.cpp
> ./a.out

यदि आप चरण 1 के बाद stdafx.h को हटा दें तो भी आपका संकलन काम करेगा।


8

-xसी ++ के लिए विनिर्देशक precompiled हेडर है -x c++-header, नहीं-x c++ । पीसीएच का उदाहरण उपयोग इस प्रकार है।

pch.h:

// Put your common include files here: Boost, STL as well as your project's headers.

main.cpp:

#include "pch.h"
// Use the PCH here.

PCH को इस तरह उत्पन्न करें:

$ g++ -x c++-header -o pch.h.gch -c pch.h

pch.h.gchएक ही निर्देशिका के रूप में में होना चाहिए pch.h, क्रम में प्रयोग की जाने वाली है, ताकि आप निर्देशिका है जहाँ से उपरोक्त आदेश पर अमल सुनिश्चित करने के pch.hलिए है।


3
यह होना चाहिए -c pch.h, नहीं -c pch.cpp?
एमएम

7

मैं पिछले समय में एक बार gcc के तहत काम करने वाले पहले से तैयार हेडर प्राप्त करने में कामयाब रहा हूं, और मुझे याद है कि समस्याएँ भी हैं। याद रखने वाली बात यह है कि gcc फाइल को अनदेखा कर देगा ( शीर्षलेख । H.gch या इसी तरह की) यदि कुछ शर्तें पूरी नहीं हुई हैं, तो इसकी एक सूची gcc से जुड़े हेडर प्रलेखन पृष्ठ पर पाई जा सकती है ।

आम तौर पर अपनी बिल्ड सिस्टम को .gch फ़ाइल को पहले चरण के रूप में संकलित करना सबसे सुरक्षित है, जिसमें कमांड लाइन विकल्प और आपके स्रोत के बाकी हिस्सों के समान निष्पादन योग्य है। यह सुनिश्चित करता है कि फ़ाइल अद्यतित है और कोई सूक्ष्म अंतर नहीं हैं।

संभवतया यह एक अच्छा विचार है कि इसे पहले एक आकस्मिक उदाहरण के साथ काम करना, बस इस संभावना को दूर करना है कि आपकी समस्याएं आपके प्रोजेक्ट में स्रोत कोड के लिए विशिष्ट हैं।


7

जिस तरह से आप इसे अपने स्रोत फ़ाइल के लिए कहते हैं, लेकिन एक हेडर फ़ाइल के साथ कॉल करें।

जैसे

g++ $(CPPFLAGS) test.h

यह test.h.gch नामक एक फ़ाइल उत्पन्न करता है

हर बार gcc टेस्ट के लिए खोज करता है। यह पहले test.h.gch के लिए दिखता है और यदि यह पाया जाता है तो यह इसे अपने आप उपयोग करता है।

अधिक जानकारी GCC Precompiled Headers के अंतर्गत पाई जा सकती है


मैं gcc 3.4 का उपयोग कर रहा हूँ और लाइन g ++ stdafx.h संकलित नहीं करेगा, आपको त्रुटि "g ++: हेडर फ़ाइल का संकलन" का अनुरोध मिलता है, लेकिन यह संकलित करेगा, यदि मैं जो चाहता हूँ तो यह सुनिश्चित नहीं होगा: "g ++ -c -x c ++
stdafx.h

0

यह सुनिश्चित कर लें -include your_header.h

यह है कि मैं कैसे precompiled और इस्तेमाल किया bits/stdc++.h संग्रह का ।

कोड

#include <bits/stdc++.h>

तब मैंने अपनी फ़ाइल को -H के साथ संकलित करके और आउटपुट को देखते हुए एफबीआई को स्थित किया

g++ sol.cpp -H -O3 -pthread -lm -std=c++14 -o executable

जहाँ मैंने देखा

. /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h

इसलिए मैंने bitsवर्तमान एक के अंदर एक नई निर्देशिका बनाई stdc++.hऔर वहां से नकल की ।

फिर मैं भागा

g++ bits/stdc++.h -O3 -std=c++14  -pthread

जो उत्पन्न हुआ bits/stdc++.gch

आम तौर पर मैं के माध्यम से अपने कोड संकलित किया

g++ sol.cpp -O3 -pthread -lm -std=c++14 -o executable

, लेकिन मुझे इसे संशोधित करना पड़ा

g++ sol.cpp -include bits/stdc++.h -O3 -pthread -lm -std=c++14 -o executable

के रूप में यह केवल का संकल्प लिया .gchबजाय फ़ाइल .hके साथ -include bits/stdc++.h वह मेरे लिए महत्वपूर्ण था। ध्यान रखने वाली दूसरी बात यह है कि आपको *.hहेडर फ़ाइल को लगभग उसी मापदंडों के साथ संकलित करना होगा जैसे आप अपना संकलन करते हैं *.cpp। जब मैंने शामिल नहीं किया था -O3या -pthreadइसने *.gchपूर्वनिर्धारित हेडर को अनदेखा किया था ।

यह जाँचने के लिए कि क्या सब कुछ सही है आप परिणाम की तुलना करके समय अंतर को माप सकते हैं

time g++ sol.cpp ...

या चलाते हैं

g++ sol.cpp -H -O3 -pthread -lm -std=c++14 -o executable

फिर से हेडर पथों की तलाश करें और यदि आप अब !पुस्तकालय पथ से पहले आते हैं , उदाहरण के लिए

! ./bits/stdc++.h.gch
....
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.