জিসিসির সাথে কাজ করা প্রাকম্পম্পাইল শিরোনাম পেয়ে কারও কি সাফল্য ছিল? আমার প্রচেষ্টায় আমার ভাগ্য নেই এবং কীভাবে এটি সেট আপ করা যায় তার জন্য আমি খুব ভাল উদাহরণ দেখিনি। আমি সাইগউইন জিসিসি ৩.৪.৪ ব্যবহার করেছি এবং উবুন্টুতে ৪.০ ব্যবহার করেছি।
জিসিসির সাথে কাজ করা প্রাকম্পম্পাইল শিরোনাম পেয়ে কারও কি সাফল্য ছিল? আমার প্রচেষ্টায় আমার ভাগ্য নেই এবং কীভাবে এটি সেট আপ করা যায় তার জন্য আমি খুব ভাল উদাহরণ দেখিনি। আমি সাইগউইন জিসিসি ৩.৪.৪ ব্যবহার করেছি এবং উবুন্টুতে ৪.০ ব্যবহার করেছি।
উত্তর:
আমি অবশ্যই সাফল্য পেয়েছি। প্রথমত, আমি নিম্নলিখিত কোড ব্যবহার করেছি:
#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
-Winvalid-pch
সঠিকভাবে ব্যবহার হচ্ছে তা নিশ্চিত করার চেষ্টা করে চেষ্টা করেছেন ? আমাদের ডিবাগ বিল্ডগুলির জন্য pch ব্যবহার করে আমরা একটি বড় উন্নতি লক্ষ্য করেছি, তাই আপনার সেটআপে কোনও সমস্যা আছে কিনা তা আমি অবাক করি।
প্রথমত, ডকুমেন্টেশন এখানে দেখুন ।
আপনি অন্য যে কোনও ফাইলের মতো শিরোনাম সংকলন করেছেন তবে আপনি আউটপুটটিকে একটি প্রত্যয় সহ একটি ফাইলের ভিতরে রেখেছেন .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
-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
হয়।
-c pch.h
, না -c pch.cpp
?
আমি অতীতে একবার জিসিসির অধীনে কাজ করা প্রাকম্পম্পাইল শিরোনামগুলি পরিচালনা করতে সক্ষম হয়েছি এবং আমি তখনও সমস্যাগুলির কথা স্মরণ করি। মনে রাখার বিষয়টি হ'ল কিছু শর্ত পূরণ না করা হলে জিসিসি ফাইলটিকে উপেক্ষা করবে ( শিরোনাম ..gch বা অনুরূপ), একটি তালিকা জিসিসি প্রাকম্পম্পাইল হেডার ডকুমেন্টেশন পৃষ্ঠায় পাওয়া যাবে ।
সাধারণত আপনার বিল্ড সিস্টেমটি একই কমান্ড লাইনের বিকল্পগুলির সাহায্যে .gch ফাইলটিকে প্রথম পদক্ষেপ হিসাবে সংকলন করা এবং আপনার উত্সের বাকী অংশ হিসাবে নির্বাহযোগ্য sa এটি নিশ্চিত করে যে ফাইলটি আপ টু ডেট এবং কোনও সূক্ষ্ম পার্থক্য নেই।
আপনার সমস্যাগুলি আপনার প্রকল্পের উত্স কোডের সাথে সুনির্দিষ্ট হওয়ার সম্ভাবনাটি সরিয়ে ফেলতে প্রথমে এটি একটি স্বতন্ত্র উদাহরণের সাথে কাজ করা সম্ভবত একটি ভাল ধারণা।
আপনি যেমন আপনার উত্স ফাইলের জন্য কল করেছেন ঠিক তেমনভাবে জিডিসি কল করুন তবে একটি শিরোনাম ফাইলের সাথে।
যেমন
g++ $(CPPFLAGS) test.h
এটি test.h.gch নামে একটি ফাইল উত্পন্ন করে
প্রতিবার gcc টেস্টের জন্য অনুসন্ধান করে test এটি প্রথম hd..gch জন্য সন্ধান করে এবং যদি এটি খুঁজে পায় এটি স্বয়ংক্রিয়ভাবে এটি ব্যবহার করে।
আরও তথ্য জিসিসির প্রাকম্পম্পাইল শিরোনামের অধীনে পাওয়া যাবে
নিশ্চিত করা -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
....