किसी को भी जीसीसी के साथ काम कर रहे पूर्व मुखिया बनने में कोई सफलता मिली? मुझे अपने प्रयासों में कोई भाग्य नहीं था और मैंने इसे स्थापित करने के कई अच्छे उदाहरण नहीं देखे हैं। मैंने cygwin gcc पर 3.4.4 और Ubuntu पर 4.0 का उपयोग करने की कोशिश की है।
किसी को भी जीसीसी के साथ काम कर रहे पूर्व मुखिया बनने में कोई सफलता मिली? मुझे अपने प्रयासों में कोई भाग्य नहीं था और मैंने इसे स्थापित करने के कई अच्छे उदाहरण नहीं देखे हैं। मैंने cygwin gcc पर 3.4.4 और Ubuntu पर 4.0 का उपयोग करने की कोशिश की है।
जवाबों:
मुझे निश्चित रूप से सफलता मिली है। सबसे पहले, मैंने निम्नलिखित कोड का उपयोग किया:
#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
-Winvalid-pch
यह सुनिश्चित करने के लिए उपयोग करने की कोशिश की है कि पहले से तैयार हेडर का सही इस्तेमाल हो रहा है? हम अपने डिबग बिल्ड के लिए pch का उपयोग करके एक बड़े सुधार को देखते हैं, इसलिए मुझे आश्चर्य है कि अगर आपके सेटअप में कोई समस्या है।
सबसे पहले, यहां प्रलेखन देखें ।
आप हेडर को किसी अन्य फ़ाइल की तरह संकलित करते हैं, लेकिन आप आउटपुट को फ़ाइल के अंदर एक प्रत्यय के साथ रखते हैं .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 को हटा दें तो भी आपका संकलन काम करेगा।
-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
लिए है।
-c pch.h
, नहीं -c pch.cpp
?
मैं पिछले समय में एक बार gcc के तहत काम करने वाले पहले से तैयार हेडर प्राप्त करने में कामयाब रहा हूं, और मुझे याद है कि समस्याएँ भी हैं। याद रखने वाली बात यह है कि gcc फाइल को अनदेखा कर देगा ( शीर्षलेख । H.gch या इसी तरह की) यदि कुछ शर्तें पूरी नहीं हुई हैं, तो इसकी एक सूची gcc से जुड़े हेडर प्रलेखन पृष्ठ पर पाई जा सकती है ।
आम तौर पर अपनी बिल्ड सिस्टम को .gch फ़ाइल को पहले चरण के रूप में संकलित करना सबसे सुरक्षित है, जिसमें कमांड लाइन विकल्प और आपके स्रोत के बाकी हिस्सों के समान निष्पादन योग्य है। यह सुनिश्चित करता है कि फ़ाइल अद्यतित है और कोई सूक्ष्म अंतर नहीं हैं।
संभवतया यह एक अच्छा विचार है कि इसे पहले एक आकस्मिक उदाहरण के साथ काम करना, बस इस संभावना को दूर करना है कि आपकी समस्याएं आपके प्रोजेक्ट में स्रोत कोड के लिए विशिष्ट हैं।
जिस तरह से आप इसे अपने स्रोत फ़ाइल के लिए कहते हैं, लेकिन एक हेडर फ़ाइल के साथ कॉल करें।
जैसे
g++ $(CPPFLAGS) test.h
यह test.h.gch नामक एक फ़ाइल उत्पन्न करता है
हर बार gcc टेस्ट के लिए खोज करता है। यह पहले test.h.gch के लिए दिखता है और यदि यह पाया जाता है तो यह इसे अपने आप उपयोग करता है।
अधिक जानकारी GCC Precompiled Headers के अंतर्गत पाई जा सकती है
यह सुनिश्चित कर लें -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
....