জিসিসি সহ প্রাকম্পম্পিত শিরোনাম


91

জিসিসির সাথে কাজ করা প্রাকম্পম্পাইল শিরোনাম পেয়ে কারও কি সাফল্য ছিল? আমার প্রচেষ্টায় আমার ভাগ্য নেই এবং কীভাবে এটি সেট আপ করা যায় তার জন্য আমি খুব ভাল উদাহরণ দেখিনি। আমি সাইগউইন জিসিসি ৩.৪.৪ ব্যবহার করেছি এবং উবুন্টুতে ৪.০ ব্যবহার করেছি।


আমি এটি চেষ্টা করেছি এবং আমার প্রাকম্পম্পাইল্ড শিরোনামগুলির জন্য সর্বোত্তম ব্যবহারের কেস পেয়েছি কারণ আমার সি উত্সটি সংকলকটি উত্পন্ন এবং ব্যবহারকারী লিখিত নয়। সান স্টুডিও এবং বিশেষত ভিজ্যুয়াল স্টুডিও বিল্ড সময়কে অনেক উন্নত করেছে। জিসিসিতে এটি পূর্ব-পূর্বের শিরোনাম ছাড়াই আরও খারাপ হয়ে উঠছিল। এটি ছিল 3.4 এর সাথে 4.x পরীক্ষা করা হয়নি তবে গতি এবং জিসিসি পারস্পরিক একচেটিয়া।
লোথার

@ লোথার কোড কী ছিল? আমি কিছু ভারী টেম্পলেটযুক্ত কোডে সাম্প্রতিক ভিজ্যুয়াল স্টুডিও সংকলকগুলির চেয়ে 10+ গিগাবাইট আরও দ্রুত খুঁজে পাই।
সোয়াইন

আমি আমার সি ++ কোডে টেম্পলেট ব্যবহার করছি না। এটি কেবল সি + ব্যতিক্রম হ্যান্ডলিং + দুর্দান্ত সি ++ এক্সটেনশন। এখনও এই প্রশ্নের 6 বছর পরে VS2010 একটি মাত্রা দ্রুত। তবে ইতিমধ্যে আমার কাছে 16 টি কোর রয়েছে যাতে আমি এটির সাথে থাকতে পারি।
লথার

উত্তর:


59

আমি অবশ্যই সাফল্য পেয়েছি। প্রথমত, আমি নিম্নলিখিত কোড ব্যবহার করেছি:


#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

সুতরাং আমি ঠিক একই পতাকাগুলি সহ এক্স্প্রেসিভ। Hpp ফাইলটি সংকলন করার জন্য একটি আদেশ লিখেছি:

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

আমি আবার মূল কোডটি সংকলন করে -Hএই আউটপুটটি পেয়েছি:

জি ++ -ওয়াল-অনুভূতি -H -g -c main.cpp -o আপত্তি / ডিবাগ / মেইন.ও
! /usr/local/include/boost/xpressive/xpressive.hpp.gch
main.cpp
। /usr/incolve/c++/4.4/iostream
.. /usr/incolve/c++/4.4/x86_64-linux-gnu/bit/c++config.h
.. /usr/incolve/c++/4.4/ostream
.. /usr/incolve/c++/4.4/istream
main.cpp

দ্য ! এর অর্থ হ'ল সংকলক প্রাকম্পম্পাইল্ড শিরোলেখ ব্যবহার করতে সক্ষম হয়েছিল। একটি এক্স এর অর্থ এটি এটি ব্যবহার করতে সক্ষম ছিল না। উপযুক্ত সংকলক পতাকা ব্যবহার করা অত্যন্ত গুরুত্বপূর্ণ। আমি এইচটি বন্ধ করে দিয়েছিলাম এবং কিছু গতি পরীক্ষা চালিয়েছি। পূর্বনির্ধারিত শিরোনামের 14 সেকেন্ড থেকে 11 সেকেন্ডের মধ্যে উন্নতি হয়েছিল। খারাপ না, কিন্তু ভালও না.

দ্রষ্টব্য: উদাহরণের লিঙ্কটি এখানে: http://www.boost.org/doc/libs/1_43_0/doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.example আমি এতে কাজ করতে পারি না পোস্ট

বিটিডাব্লু: আমি নিম্নলিখিত জি ++ ব্যবহার করছি

g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3


20
উইনডিয়াল-পিচএইচ যুক্ত করা আপনাকে পিএইচসি ব্যবহারের ক্ষেত্রে এবং কেন কিছু ভুল হয় তা ডিবাগ করতে সহায়তা করবে।
বাম পাশে

"খারাপ নয় তবে দুর্দান্ত নয়" প্রাকম্পম্পাইল্ড শিরোনামগুলি দরকারী যখন আপনার অনেকগুলি শিরোনাম একে অপরকে সংযুক্ত করে, তাই তারা খুব বড় প্রকল্পে সংকলনের সময় হ্রাস করবে যা বড় লাইব্রেরি বা অনেক লাইব্রেরি ব্যবহার করে।
জোকুন

4
"খারাপ নয় তবে দুর্দান্ত নয়": gcc 4.4.7, 136 .cpp ফাইলগুলি 35.5 এমবি মোট আকার ব্যবহার করে, 148 .h ফাইলগুলি 5.5 এমবি মোট আকার, .gch ফাইলটি 48 এমবি, ডিবাগ বিল্ডটি 2'20 লাগে "(বনাম 2) '14 "নন-প্যাচ), -ও 2 অপটিমাইজড বিল্ডটি 4'30" লাগে (বনাম 5'33 "নন-পিসি) প্রভাবটি ডাবগ বিল্ডগুলির নিকটে প্রত্যাশিত হবে, তবে এটি কেবলমাত্র অনুকূলিত বিল্ড যা প্রাকম্পম্পিং থেকে লাভ করে .... নিশ্চিত কেন। উইন্ডোজে প্রাকম্পম্পিংটি আরও নাটকীয়!
আন্দ্রেস ভার্জিসন

4
(cont'd) সংশ্লিষ্ট pch / non-pch আউটপুট ফাইলগুলির ঠিক একই আকারের বাইট আকার রয়েছে, এটি ভাল। উপরের সময়গুলি বিল্ডগুলি পুনরাবৃত্তি করার সময় পরিবর্তিত হয় বলে মনে হয়, উদাহরণস্বরূপ -O2 নন-pch 3'45 "এবং 5'33" এর মধ্যে পরিবর্তিত হয়, সুতরাং এটি সঠিক বিজ্ঞান নয়, সম্ভবত ভিএমওয়্যারটিতে চলার কারণে। যাইহোক, gcc pch আমার ক্ষেত্রে মোটেই সুবিধাজনক দেখাচ্ছে না। এটি উইন্ডোজ ভিএস ২০১২ (x64, একক থ্রেডেড সংকলন) এর একই কোড বেসের সাথে তুলনা করুন: ডিবাগ 46 "pch, 2'50" নন-প্যাচ, 2'13 "pch, 5'02" নন-pch প্রকাশ করুন। এবং অবশ্যই মাল্টি-প্রসেসর সক্ষম করার সময় আরও দ্রুত ...
আন্দ্রেস ভার্জিসন

@ অ্যান্ড্রেস ভার্জিসন - আপনি কি প্রাক্পম্পাইল্ড শিরোনামটি -Winvalid-pchসঠিকভাবে ব্যবহার হচ্ছে তা নিশ্চিত করার চেষ্টা করে চেষ্টা করেছেন ? আমাদের ডিবাগ বিল্ডগুলির জন্য pch ব্যবহার করে আমরা একটি বড় উন্নতি লক্ষ্য করেছি, তাই আপনার সেটআপে কোনও সমস্যা আছে কিনা তা আমি অবাক করি।
জোশ কেলি

52

প্রথমত, ডকুমেন্টেশন এখানে দেখুন

আপনি অন্য যে কোনও ফাইলের মতো শিরোনাম সংকলন করেছেন তবে আপনি আউটপুটটিকে একটি প্রত্যয় সহ একটি ফাইলের ভিতরে রেখেছেন .gch

সুতরাং উদাহরণস্বরূপ আপনি stdafx.h প্রাক্পম্পাইল করলে আপনার কাছে একটি প্রাকম্পাইল্ড শিরোনাম থাকবে যা stdafx.h.gchযে কোনও সময় অন্তর্ভুক্ত করার সময় স্বয়ংক্রিয়ভাবে অনুসন্ধান করা হবে calledstdafx.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 অপসারণ করলেও আপনার সংকলনটি কাজ করবে work


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.

এইভাবে পিএইচসি তৈরি করুন:

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

pch.h.gchএকই ডিরেক্টরির হিসাবে হওয়া আবশ্যক pch.h, যাতে ব্যবহার করা হবে যাতে আপনি ডিরেক্টরি কোথা থেকে উপরে কমান্ড প্রয়োগ নিশ্চিত করতে pch.hহয়।


4
এই হওয়া উচিত -c pch.h, না -c pch.cpp?
এমএম

7

আমি অতীতে একবার জিসিসির অধীনে কাজ করা প্রাকম্পম্পাইল শিরোনামগুলি পরিচালনা করতে সক্ষম হয়েছি এবং আমি তখনও সমস্যাগুলির কথা স্মরণ করি। মনে রাখার বিষয়টি হ'ল কিছু শর্ত পূরণ না করা হলে জিসিসি ফাইলটিকে উপেক্ষা করবে ( শিরোনাম ..gch বা অনুরূপ), একটি তালিকা জিসিসি প্রাকম্পম্পাইল হেডার ডকুমেন্টেশন পৃষ্ঠায় পাওয়া যাবে

সাধারণত আপনার বিল্ড সিস্টেমটি একই কমান্ড লাইনের বিকল্পগুলির সাহায্যে .gch ফাইলটিকে প্রথম পদক্ষেপ হিসাবে সংকলন করা এবং আপনার উত্সের বাকী অংশ হিসাবে নির্বাহযোগ্য sa এটি নিশ্চিত করে যে ফাইলটি আপ টু ডেট এবং কোনও সূক্ষ্ম পার্থক্য নেই।

আপনার সমস্যাগুলি আপনার প্রকল্পের উত্স কোডের সাথে সুনির্দিষ্ট হওয়ার সম্ভাবনাটি সরিয়ে ফেলতে প্রথমে এটি একটি স্বতন্ত্র উদাহরণের সাথে কাজ করা সম্ভবত একটি ভাল ধারণা।


7

আপনি যেমন আপনার উত্স ফাইলের জন্য কল করেছেন ঠিক তেমনভাবে জিডিসি কল করুন তবে একটি শিরোনাম ফাইলের সাথে।

যেমন

g++ $(CPPFLAGS) test.h

এটি test.h.gch নামে একটি ফাইল উত্পন্ন করে

প্রতিবার gcc টেস্টের জন্য অনুসন্ধান করে test এটি প্রথম hd..gch জন্য সন্ধান করে এবং যদি এটি খুঁজে পায় এটি স্বয়ংক্রিয়ভাবে এটি ব্যবহার করে।

আরও তথ্য জিসিসির প্রাকম্পম্পাইল শিরোনামের অধীনে পাওয়া যাবে


আমি জিসিসি ৩.৪ ব্যবহার করছি এবং জি ++ stdafx.h লাইনটি সংকলন করবে না, আপনি ত্রুটি পেয়েছেন "জি ++: শিরোলেখের ফাইলের সংকলন অনুরোধ করা হয়েছে", তবে এটি সঙ্কলন করবে, যদিও আমি এটি চাই কিনা তা নিশ্চিত নয়: "g ++ -c -x c ++ stdafx.h -o stdafx.h.pch "
স্টেফানবি

1

নিশ্চিত করা -include your_header.h

এইভাবে আমি 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
....
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.