GCC ile çalışan önceden derlenmiş başlıkları elde eden herhangi bir başarı elde eden var mı? Girişimlerimde hiç şansım olmadı ve nasıl kurulacağına dair pek çok iyi örnek görmedim. Cygwin gcc 3.4.4 üzerinde ve Ubuntu üzerinde 4.0 kullanmayı denedim.
GCC ile çalışan önceden derlenmiş başlıkları elde eden herhangi bir başarı elde eden var mı? Girişimlerimde hiç şansım olmadı ve nasıl kurulacağına dair pek çok iyi örnek görmedim. Cygwin gcc 3.4.4 üzerinde ve Ubuntu üzerinde 4.0 kullanmayı denedim.
Yanıtlar:
Kesinlikle başarılı oldum. İlk önce aşağıdaki kodu kullandım:
#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;
}
Bu, Boost Xpressive'den sadece merhaba bir dünyaydı (bağlantı için aşağıya bakın). Öncelikle -H
gcc'deki seçenekle derledim . Kullandığı muazzam bir başlık listesi gösterdi. Sonra, IDE'min (kod :: blokları) ürettiği derleme bayraklarına bir göz attım ve şöyle bir şey gördüm:
g++ -Wall -fexceptions -g -c main.cpp -o obj/Debug/main.o
Bu yüzden Xpressive.hpp dosyasını aynı bayraklarla derlemek için bir komut yazdım:
sudo g++ -Wall -fexceptions -g /usr/local/include/boost/xpressive/xpressive.hpp
Orijinal kodu ile tekrar derledim -H
ve şu çıktıyı aldım:
g ++ -Wall -fexceptions -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
! derleyicinin önceden derlenmiş başlığı kullanabildiği anlamına gelir. Bir x, onu kullanamadığı anlamına gelir. Uygun derleyici bayraklarını kullanmak çok önemlidir. -H'yi çıkardım ve bazı hız testleri yaptım. Önceden derlenmiş başlık 14 saniyeden 11 saniyeye çıktı. Fena değil ama harika değil.
Not: Burada örnek bağlantısı şudur: http://www.boost.org/doc/libs/1_43_0/doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.examples Ben iş için alamadım İleti.
BTW: Şu g ++ kullanıyorum
g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3
-Winvalid-pch
Önceden derlenmiş üstbilginin düzgün şekilde kullanıldığından emin olmak için kullanmayı denediniz mi? Hata ayıklama yapılarımız için pch kullanımında büyük bir gelişme olduğunu fark ettik, bu yüzden kurulumunuzda bir sorun olup olmadığını merak ediyorum.
Öncelikle buradaki belgelere bakın .
Başlıkları tıpkı diğer dosyalar gibi derlersiniz, ancak çıktıyı bir dosyanın içine koyarsınız .gch
.
Örneğin, stdafx.h dosyasını önceden derlerseniz, her eklediğinizde çağrılmak üzere otomatik olarak aranacak önceden derlenmiş bir başlığa sahip stdafx.h.gch
olursunuz.stdafx.h
Misal:
stdafx.h:
#include <string>
#include <stdio.h>
a.cpp:
#include "stdafx.h"
int main(int argc, char**argv)
{
std::string s = "Hi";
return 0;
}
Ardından şu şekilde derleyin:
> g++ -c stdafx.h -o stdafx.h.gch
> g++ a.cpp
> ./a.out
1. adımdan sonra stdafx.h dosyasını kaldırsanız bile derlemeniz çalışacaktır.
-x
C ++ için belirteci başlıkları olduğunu precompiled -x c++-header
değil -x c++
. PCH'nin örnek kullanımı aşağıdadır.
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'yi şu şekilde oluşturun:
$ g++ -x c++-header -o pch.h.gch -c pch.h
, Kullanılabilmesi pch.h.gch
için ile aynı dizinde olmalıdır pch.h
, bu nedenle yukarıdaki komutu olduğu dizinden çalıştırdığınızdan emin olun pch.h
.
-c pch.h
, değil -c pch.cpp
mi?
Geçmişte bir kez gcc altında çalışan önceden derlenmiş başlıkları almayı başardım ve o zamanlar da sorun yaşadığımı hatırlıyorum. Unutulmaması gereken şey, gcc'nin belirli koşullar yerine getirilmediği takdirde dosyayı (header.h.gch veya benzeri) yok sayacağıdır, bunların bir listesi gcc önceden derlenmiş başlık dokümantasyon sayfasında bulunabilir .
Genellikle, derleme sisteminizin .gch dosyasını ilk adım olarak, aynı komut satırı seçenekleriyle ve kaynağınızın geri kalanıyla çalıştırılabilir şekilde derlemesini sağlamak en güvenlisidir. Bu, dosyanın güncel olmasını ve küçük farklar olmamasını sağlar.
Problemlerinizin projenizdeki kaynak koda özgü olma olasılığını ortadan kaldırmak için, ilk önce bunun uydurulmuş bir örnekle çalışmasını sağlamak muhtemelen iyi bir fikirdir.
Gcc'yi kaynak dosyanız için çağırdığınız şekilde, ancak bir başlık dosyasıyla çağırın.
Örneğin
g++ $(CPPFLAGS) test.h
bu, test.h.gch adlı bir dosya oluşturur
Gcc test.h'yi her aradığında önce test.h.gch dosyasını arar ve bulursa otomatik olarak kullanır.
Daha fazla bilgi GCC Önceden Derlenmiş Başlıkları altında bulunabilir.
Emin ol -include your_header.h
bits/stdc++.h
Koleksiyonu böyle önceden derledim ve kullandım .
Kod
#include <bits/stdc++.h>
Sonra dosyamı -H ile derleyip çıktıya bakarak lib'yi buldum
g++ sol.cpp -H -O3 -pthread -lm -std=c++14 -o executable
nerede gördüm
. /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h
Bu yüzden bits
mevcut dizinin içinde yeni bir dizin oluşturdum ve stdc++.h
oradan kopyaladım .
Sonra koştum
g++ bits/stdc++.h -O3 -std=c++14 -pthread
hangi üretti bits/stdc++.gch
Normalde kodumu şu yolla derledim:
g++ sol.cpp -O3 -pthread -lm -std=c++14 -o executable
ama bunu değiştirmek zorunda kaldım
g++ sol.cpp -include bits/stdc++.h -O3 -pthread -lm -std=c++14 -o executable
sadece karar olarak .gch
yerine dosyaya .h
sahip -include bits/stdc++.h
Bu benim için anahtar oldu. Akılda tutulması gereken diğer bir şey de *.h
başlık dosyasını *.cpp
. Önceden derlenmiş başlığı eklemediğimde -O3
veya -pthread
yok *.gch
saydığımda.
Her şeyin doğru olup olmadığını kontrol etmek için, sonucunu karşılaştırarak zaman farkını ölçebilirsiniz.
time g++ sol.cpp ...
veya koş
g++ sol.cpp -H -O3 -pthread -lm -std=c++14 -o executable
tekrar ve başlık yollarını arayın ve şimdi !
kitaplık yolundan önce gelirseniz , örneğin
! ./bits/stdc++.h.gch
....