Adakah yang berhasil mendapatkan header yang dikompilasi sebelumnya yang bekerja dengan GCC? Saya tidak beruntung dalam upaya saya dan saya belum melihat banyak contoh bagus tentang cara menyiapkannya. Saya sudah mencoba cygwin gcc 3.4.4 dan menggunakan 4.0 di Ubuntu.
c++
gcc
precompiled-headers
Lee Baldwin
sumber
sumber
Jawaban:
Saya pasti sukses. Pertama, saya menggunakan kode berikut:
#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; }
Ini hanyalah hello world dari Boost Xpressive (lihat link di bawah). Pertama, saya mengkompilasi dengan
-H
opsi di gcc. Itu menunjukkan daftar besar header yang digunakannya. Kemudian, saya melihat bendera kompilasi yang diproduksi oleh IDE (code :: blocks) saya dan melihat sesuatu seperti ini:g++ -Wall -fexceptions -g -c main.cpp -o obj/Debug/main.o
Jadi saya menulis perintah untuk mengompilasi file Xpressive.hpp dengan flag yang sama persis:
sudo g++ -Wall -fexceptions -g /usr/local/include/boost/xpressive/xpressive.hpp
Saya mengkompilasi kode asli lagi dengan
-H
dan mendapatkan keluaran ini:The! berarti kompilator dapat menggunakan header yang telah dikompilasi sebelumnya. Tanda x berarti tidak dapat menggunakannya. Menggunakan flag compiler yang tepat sangatlah penting. Saya melepas -H dan menjalankan beberapa tes kecepatan. Header yang telah dikompilasi mengalami peningkatan dari 14 detik menjadi 11 detik. Tidak buruk tapi tidak bagus.
Catatan: Berikut tautan ke contoh: http://www.boost.org/doc/libs/1_43_0/doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.examples Saya tidak bisa membuatnya berfungsi di pos.
BTW: Saya menggunakan g ++ berikut
g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3
sumber
-Winvalid-pch
untuk memastikan bahwa tajuk yang dikompilasi sebelumnya digunakan dengan benar? Kami melihat peningkatan besar menggunakan pch untuk debug build kami, jadi saya ingin tahu apakah ada masalah dengan penyiapan Anda.Pertama, lihat dokumentasi di sini .
Anda mengkompilasi header seperti file lainnya tetapi Anda meletakkan output di dalam file dengan akhiran
.gch
.Jadi misalnya jika Anda mengkompilasi stdafx.h Anda akan memiliki header yang telah dikompilasi yang akan secara otomatis dicari dipanggil
stdafx.h.gch
kapan saja Anda menyertakanstdafx.h
Contoh:
stdafx.h:
#include <string> #include <stdio.h>
a.cpp:
#include "stdafx.h" int main(int argc, char**argv) { std::string s = "Hi"; return 0; }
Kemudian kompilasi sebagai:
Kompilasi Anda akan berfungsi meskipun Anda menghapus stdafx.h setelah langkah 1.
sumber
The
-x
specifier untuk C ++ dikompilasi header adalah-x c++-header
, tidak-x c++
. Contoh penggunaan PCH berikut.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.
Hasilkan PCH seperti ini:
The
pch.h.gch
harus dalam direktori yang sama sepertipch.h
agar dapat digunakan, jadi pastikan bahwa Anda menjalankan perintah di atas dari direktori manapch.h
adalah.sumber
-c pch.h
, bukan-c pch.cpp
?Saya telah berhasil mendapatkan header yang telah dikompilasi yang bekerja di bawah gcc sekali di masa lalu, dan saya ingat mengalami masalah saat itu juga. Hal yang perlu diingat adalah bahwa gcc akan mengabaikan file (header.h.gch atau serupa) jika kondisi tertentu tidak terpenuhi, daftarnya dapat ditemukan di halaman dokumentasi header yang dikompilasi gcc .
Umumnya, yang paling aman adalah membuat sistem build Anda mengompilasi file .gch sebagai langkah pertama, dengan opsi baris perintah yang sama dan dapat dieksekusi seperti sumber Anda lainnya. Ini memastikan file tersebut mutakhir dan tidak ada perbedaan halus.
Mungkin juga ide bagus untuk membuatnya bekerja dengan contoh yang dibuat-buat terlebih dahulu, hanya untuk menghilangkan kemungkinan bahwa masalah Anda spesifik untuk kode sumber dalam proyek Anda.
sumber
Panggil gcc dengan cara yang sama seperti Anda memanggilnya untuk file sumber Anda tetapi dengan file header.
misalnya
ini menghasilkan file bernama test.h.gch
Setiap kali gcc mencari test.h, gcc mencari test.h.gch terlebih dahulu dan jika menemukannya, ia akan menggunakannya secara otomatis.
Informasi lebih lanjut dapat ditemukan di bawah GCC Precompiled Headers
sumber
Pastikan untuk
-include your_header.h
Beginilah cara saya menyusun dan menggunakan
bits/stdc++.h
koleksi.Kode
#include <bits/stdc++.h>
Kemudian saya menemukan lib dengan mengkompilasi file saya dengan -H dan melihat output
g++ sol.cpp -H -O3 -pthread -lm -std=c++14 -o executable
dimana saya melihat
. /usr/include/x86_64-linux-gnu/c++/7/bits/stdc++.h
Jadi saya membuat direktori baru
bits
di dalam direktori saat ini dan menyalinstdc++.h
dari sana.Lalu aku lari
g++ bits/stdc++.h -O3 -std=c++14 -pthread
yang dihasilkan
bits/stdc++.gch
Biasanya saya mengumpulkan kode saya melalui
g++ sol.cpp -O3 -pthread -lm -std=c++14 -o executable
, tapi saya harus memodifikasinya menjadi
g++ sol.cpp -include bits/stdc++.h -O3 -pthread -lm -std=c++14 -o executable
karena hanya memutuskan untuk
.gch
mengajukan, bukan.h
dengan-include bits/stdc++.h
Itu adalah kunci bagi saya. Hal lain yang perlu diingat adalah Anda harus mengkompilasi*.h
file header dengan parameter yang hampir sama dengan yang Anda kompilasi*.cpp
. Ketika saya tidak menyertakan-O3
atau-pthread
mengabaikan*.gch
header yang telah dikompilasi sebelumnya.Untuk memeriksa apakah semuanya benar Anda dapat mengukur perbedaan waktu dengan membandingkan hasil
time g++ sol.cpp ...
atau lari
g++ sol.cpp -H -O3 -pthread -lm -std=c++14 -o executable
lagi dan cari jalur header dan jika Anda sekarang mendapatkan
!
sebelum jalur perpustakaan, misalnyasumber