Önceden derlenmiş üst bilgi dosyaları
Visual Studio'da yeni bir proje oluşturduğunuzda, projeye adlı pch.h
önceden derlenmiş bir üst bilgi dosyası eklenir. (Visual Studio 2017 ve önceki sürümlerinde dosya olarak adlandırılıyordu stdafx.h
.) Dosyanın amacı derleme işlemini hızlandırmaktır. Gibi Standart Kitaplık üst bilgileri gibi tüm kararlı üst bilgi <vector>
dosyaları buraya eklenmelidir. Önceden derlenmiş üst bilgi yalnızca bu üst bilgi veya içerdiği dosyalar değiştirildiğinde derlenir. Yalnızca proje kaynak kodunuzda değişiklik yaparsanız, derleme önceden derlenmiş üst bilgi için derlemeyi atlar.
Önceden derlenmiş üst bilgiler için derleyici seçenekleri şunlardır: /Y
. Proje özellik sayfalarında, seçenekler Yapılandırma Özellikleri>C/C++>Önceden Derlenmiş Üst Bilgiler altında bulunur. Önceden derlenmiş üst bilgileri kullanmamayı seçebilir ve üst bilgi dosyası adını ve çıkış dosyasının adını ve yolunu belirtebilirsiniz.
Özel önceden derlenmiş kod
Oluşturulması önemli zaman alan büyük projeler için özel önceden derlenmiş dosyalar oluşturmayı düşünebilirsiniz. Microsoft C ve C++ derleyicileri, satır içi kod da dahil olmak üzere herhangi bir C veya C++ kodunu önceden derlemeye yönelik seçenekler sağlar. Bu performans özelliğini kullanarak kararlı bir kod gövdesi derleyebilir, kodun derlenmiş durumunu bir dosyada depolayabilir ve sonraki derlemeler sırasında önceden derlenmiş kodu hala geliştirme aşamasında olan kodla birleştirebilirsiniz. Kararlı kodun yeniden derlenmesi gerekmeyen sonraki her derleme daha hızlıdır.
Kaynak kodun ne zaman önceden derlenmiş olması gerekiyor?
Önceden derlenmiş kod, derleme süresini kısaltmak için geliştirme döngüsü sırasında kullanışlıdır, özellikle de aşağıdakiler:
Her zaman seyrek değişen büyük bir kod gövdesi kullanırsınız.
Programınız, tümü standart bir dosya kümesi ve aynı derleme seçeneklerini kullanan birden çok modülden oluşur. Bu durumda, tüm ekleme dosyaları önceden derlenmiş bir üst bilgide önceden derlenebilir. Ekleme dosyalarını işlemenin daha yeni yolları hakkında daha fazla bilgi için bkz . Üst bilgi birimlerini, modülleri ve önceden derlenmiş üst bilgileri karşılaştırma.
İlk derleme (önceden derlenmiş üst bilgi dosyasını oluşturan derleme) sonraki derlemelerden biraz daha uzun sürer. Sonraki derlemeler, önceden derlenmiş kodu ekleyerek daha hızlı ilerleyebilir.
Hem C hem de C++ programlarını önceden derleyebilirsiniz. C++ programlamada, sınıf arabirimi bilgilerini üst bilgi dosyalarına ayırmak yaygın bir uygulamadır. Bu üst bilgi dosyaları daha sonra sınıfını kullanan programlara eklenebilir. Bu üst bilgileri önceden derleyerek, bir programın derleme süresini azaltabilirsiniz.
Not
Kaynak dosya başına yalnızca bir önceden derlenmiş üst bilgi (.pch
) dosyası kullanabilirsiniz, ancak projede birden çok .pch
dosya kullanabilirsiniz.
Kodu önceden derlemek için iki seçenek
Herhangi bir C veya C++ kodunu önceden derleyebilirsiniz; yalnızca üst bilgi dosyalarını önceden derlemekle sınırlı değilsiniz.
Ön derleme planlama gerektirir, ancak basit üst bilgi dosyaları dışında kaynak kodunu önceden derlediyseniz çok daha hızlı derlemeler sunar.
Kaynak dosyalarınızın ortak üst bilgi dosyası kümeleri kullandığını bildiğinizde veya ön derlemenize kaynak kodu eklemek istediğinizde önceden derlenmiş kod.
Önceden derlenmiş üst bilgi seçenekleri şunlardır /Yc
: (Önceden Derlenmiş Üst Bilgi Dosyası Oluştur) ve /Yu
(Önceden Derlenmiş Üst Bilgi Dosyasını Kullan). Önceden derlenmiş bir üst bilgi oluşturmak için kullanın /Yc
. İsteğe bağlı hdrstop
pragma ile kullanıldığında, /Yc
hem üst bilgi dosyalarını hem de kaynak kodunu önceden derlemenizi sağlar. Mevcut derlemede önceden derlenmiş mevcut bir üst bilgiyi kullanmak için seçin /Yu
. Önceden derlenmiş üst bilgi için alternatif bir ad sağlamak için ve /Yu
seçenekleriyle de /Yc
kullanabilirsiniz/Fp
.
için derleyici seçeneği başvuru makaleleri /Yu
ve /Yc
geliştirme ortamında bu işleve nasıl erişecekleri tartışılır.
Önceden derlenmiş üst bilgi tutarlılığı kuralları
PCH dosyaları makine ortamı ve program hakkındaki bellek adresi bilgileri içerdiğinden, yalnızca oluşturulduğu makinede bir PCH dosyası kullanmanız gerekir.
Önceden derlenmiş üst bilgilerin dosya başına kullanımı için tutarlılık kuralları
Derleyici /Yu
seçeneği, hangi PCH dosyasının kullanılacağını belirtmenize olanak tanır.
PCH dosyası kullandığınızda, aksini belirtmediğiniz sürece, derleyici PCH dosyasını oluştururken geçerli olan derleme ortamının aynısını varsayar. Derleme ortamı derleyici seçeneklerini, pragmaları vb. içerir. Derleyici bir tutarsızlık algılarsa, bir uyarı ve mümkün olduğunda tutarsızlığı tanımlar. Bu tür uyarılar PCH dosyasıyla ilgili bir sorun olduğunu göstermez; sizi olası çatışmalar konusunda uyarırlar. PCH dosyaları için tutarlılık gereksinimleri aşağıdaki bölümlerde açıklanmıştır.
Derleyici seçeneği tutarlılığı
Aşağıdaki derleyici seçenekleri, PCH dosyası kullanırken tutarsızlık uyarısı tetikleyebilir:
Önişlemci (
/D
) seçeneği kullanılarak oluşturulan makrolar, PCH dosyasını oluşturan derleme ile geçerli derleme arasında aynı olmalıdır. Tanımlı sabitlerin durumu işaretlenmez, ancak bu makrolar değişirse öngörülemeyen sonuçlar oluşabilir.PCH dosyaları ve
/EP
seçenekleriyle/E
çalışmaz.PCH dosyasını kullanan sonraki derlemelerin bu seçenekleri kullanabilmesi için ÖNCE GÖZATMA Bilgileri Oluştur (
/FR
) seçeneği veya Yerel Değişkenleri Dışla (/Fr
) seçeneği kullanılarak PCH dosyaları oluşturulmalıdır.
C 7.0 uyumlu (/Z7
)
PCH dosyası oluşturulduğunda bu seçenek etkinse, daha sonra PCH dosyasını kullanan derlemeler hata ayıklama bilgilerini kullanabilir.
PCH dosyası oluşturulduğunda C 7.0 Uyumlu (/Z7
) seçeneği etkin değilse, daha sonra PCH dosyasını kullanan derlemeler ve /Z7
bir uyarı tetikler. Hata ayıklama bilgileri geçerli .obj
dosyaya yerleştirilir ve PCH dosyasında tanımlanan yerel simgeler hata ayıklayıcı tarafından kullanılamaz.
Yol tutarlılığını dahil et
PCH dosyası, oluşturulduğu sırada geçerli olan üst bilgi ekleme yolu hakkında bilgi içermez. PCH dosyası kullandığınızda, derleyici her zaman geçerli derlemede belirtilen üst bilgi ekleme yolunu kullanır.
Kaynak dosya tutarlılığı
Önceden Derlenmiş Üst Bilgi Dosyasını (/Yu
) Kullan seçeneğini belirttiğinizde, derleyici önceden derlenecek kaynak kodda görünen tüm önişlemci yönergelerini (pragmalar dahil) yoksayar. Bu tür önişlemci yönergeleri tarafından belirtilen derleme, Önceden Derlenmiş Üst Bilgi Dosyası Oluştur (/Yc
) seçeneği için kullanılan derlemeyle aynı olmalıdır.
Pragma tutarlılığı
BIR PCH dosyasının oluşturulması sırasında işlenen pragmalar genellikle PCH dosyasının daha sonra kullanıldığı dosyayı etkiler. comment
ve message
pragmaları derlemenin geri kalanını etkilemez.
Bu pragmalar yalnızca PCH dosyasındaki kodu etkiler; daha sonra PCH dosyasını kullanan kodu etkilemez:
comment
linesize
message
page
pagesize
skip
subtitle
title
Bu pragmalar önceden derlenmiş bir üst bilginin parçası olarak tutulur ve önceden derlenmiş üst bilgiyi kullanan derlemenin geri kalanını etkiler:
alloc_text
auto_inline
check_stack
code_seg
data_seg
function
include_alias
init_seg
inline_depth
inline_recursion
intrinsic
optimize
pack
pointers_to_members
setlocale
vtordisp
warning
/Yc ve /Yu için tutarlılık kuralları
veya /Yu
kullanılarak /Yc
oluşturulan önceden derlenmiş bir üst bilgi kullandığınızda, derleyici geçerli derleme ortamını PCH dosyasını oluşturduğunuzda var olanla karşılaştırır. Geçerli derleme için öncekiyle tutarlı bir ortam (tutarlı derleyici seçenekleri, pragmalar vb. kullanarak) belirttiğinizden emin olun. Derleyici bir tutarsızlık algılarsa, bir uyarı ve mümkün olduğunda tutarsızlığı tanımlar. Bu tür uyarılar PCH dosyasıyla ilgili bir sorun olduğunu göstermez; sizi olası çatışmalar konusunda uyarırlar. Aşağıdaki bölümlerde önceden derlenmiş üst bilgiler için tutarlılık gereksinimleri açıklanmaktadır.
Derleyici seçeneği tutarlılığı
Bu tabloda, önceden derlenmiş üst bilgi kullanılırken tutarsızlık uyarısı tetikleyebilecek derleyici seçenekleri listelenmiştir:
Seçenek | Veri Akışı Adı | Kural |
---|---|---|
/D |
Sabitleri ve makroları tanımlama | Önceden derlenmiş üst bilgiyi oluşturan derleme ile geçerli derleme arasında aynı olmalıdır. Tanımlı sabitlerin durumu denetlenmiyor. Ancak, dosyalarınız değiştirilen sabitlerin değerlerine bağlıysa öngörülemeyen sonuçlar oluşabilir. |
/E veya /EP |
Ön işlemci çıkışını standart çıkışa kopyalama | Önceden derlenmiş üst bilgiler veya /EP seçeneğiyle /E çalışmaz. |
/Fr veya /FR |
Microsoft Source Browser bilgileri oluşturma | ve /FR seçeneklerinin /Fr seçeneğiyle /Yu geçerli olması için, önceden derlenmiş üst bilgi oluşturulduğunda da geçerli olmaları gerekir. Önceden derlenmiş üst bilgiyi kullanan sonraki derlemeler de Kaynak Tarayıcı bilgileri oluşturur. Tarayıcı bilgileri tek .sbr bir dosyaya yerleştirilir ve diğer dosyalar tarafından CodeView bilgileriyle aynı şekilde başvurulur. Kaynak Tarayıcı bilgilerinin yerleşimini geçersiz kılamazsınız. |
/GA , /GD , /GE , /Gw veya /GW |
Windows protokolü seçenekleri | Önceden derlenmiş üst bilgiyi oluşturan derleme ile geçerli derleme arasında aynı olmalıdır. Bu seçenekler farklıysa derleyici bir uyarı yayar. |
/Zi |
Tam hata ayıklama bilgileri oluşturma | Bu seçenek önceden derlenmiş üst bilgi oluşturulduğunda etkinse, ön derlemeyi kullanan sonraki derlemeler bu hata ayıklama bilgilerini kullanabilir. /Zi Önceden derlenmiş üst bilgi oluşturulduğunda etkin değilse, ön derlemeyi ve /Zi seçeneği kullanan sonraki derlemeler bir uyarı tetikler. Hata ayıklama bilgileri geçerli nesne dosyasına yerleştirilir ve önceden derlenmiş üst bilgide tanımlanan yerel simgeler hata ayıklayıcı tarafından kullanılamaz. |
Not
Önceden derlenmiş üst bilgi özelliği yalnızca C ve C++ kaynak dosyalarında kullanılmak üzere tasarlanmıştır.
Projede önceden derlenmiş üst bilgileri kullanma
Önceki bölümlerde önceden derlenmiş üst bilgilere genel bir bakış sağlıyoruz: /Yc ve /Yu, /Fp seçeneği ve hdrstop pragması. Bu bölümde, bir projede el ile önceden derlenmiş üst bilgi seçeneklerini kullanma yöntemi açıklanır; örnek bir makefile ile ve yönettiği kodla sona erer.
Bir projede el ile önceden derlenmiş üst bilgi seçeneklerini kullanmaya yönelik başka bir yaklaşım için, Visual Studio'nun varsayılan kurulumu sırasında oluşturulan dizinde MFC\SRC
bulunan derleme dosyalarından birini inceleyin. Bu derleme dosyaları, bu bölümde sunulana benzer bir yaklaşım benimser. Microsoft Program Bakım Yardımcı Programı (NMAKE) makrolarını daha iyi kullanır ve derleme işlemi için daha fazla denetim sunar.
Derleme işlemindeki PCH dosyaları
Bir yazılım projesinin kod tabanı genellikle birden çok C veya C++ kaynak dosyasında, nesne dosyalarında, kitaplıklarda ve üst bilgi dosyalarında bulunur. Genellikle, derleme dosyası bu öğelerin bileşimini yürütülebilir bir dosyada koordine eder. Aşağıdaki şekilde, önceden derlenmiş üst bilgi dosyası kullanan bir derleme dosyasının yapısı gösterilmektedir. NMAKE makro adları ve bu diyagramdaki dosya adları, PCH için örnek derleme dosyası ve PCH için örnek kod'da bulunan örnek kodla tutarlıdır.
Şekilde, derleme işleminin akışını göstermek için üç diyagram cihazı kullanılır. Adlandırılmış dikdörtgenler her dosyayı veya makroları temsil eder; üç makro bir veya daha fazla dosyayı temsil eder. Gölgeli alanlar her derleme veya bağlantı eylemini temsil eder. Oklar, derleme veya bağlama işlemi sırasında hangi dosya ve makroların birleştirildiği gösterir.
Önceden derlenmiş üst bilgi dosyası kullanan bir derleme dosyasının yapısı:
Diyagramda CL /c /W3 /Yc$(BOUNDRY) applib.cpp myapp.cpp beslenen '$(STABLEHDRS)' ve '$(BOUNDRY)' gösterilmektedir. Bunun çıktısı $(STABLE. PCH). Ardından applib.cpp ve $(UNSTABLEHDRS) ve $(STABLE. APPLIB.OBJ üreten CL /c /w3 /Yu $(BOUNDRY) applib.cpp PCH) akışı. myapp.cpp, $(UNSTABLEHDR) ve $(STABLE. MYAPP.OBJ üreten CL /c /w3 /Yu $(BOUNDRY) myapp.cpp PCH) akışı. Son olarak, applib.obj ve myapp.obj, myapp.exe oluşturmak için LINK /NOD ONERROR:NOEXE $(OBJS), myapp, NUL, $(LIBS), NUL ile birleştirilir.
Diyagramın en üstünden başlayarak, hem hem de STABLEHDRS
BOUNDRY
dosyaları yeniden derleme gerektirmeyecek şekilde listelediğiniz NMAKE makrolarıdır. Bu dosyalar komut dizesi tarafından derlenir
CL /c /W3 /Yc$(BOUNDRY) applib.cpp myapp.cpp
yalnızca önceden derlenmiş üst bilgi dosyası (STABLE.pch
) yoksa veya iki makroda listelenen dosyalarda değişiklik yaparsanız. Her iki durumda da, önceden derlenmiş üst bilgi dosyası yalnızca makroda STABLEHDRS
listelenen dosyalardan kod içerir. Makroda önceden derlenmiş BOUNDRY
olmasını istediğiniz son dosyayı listeleyin.
Bu makrolarda listelediğiniz dosyalar üst bilgi dosyaları veya C veya C++ kaynak dosyaları olabilir. (Tek bir PCH dosyası hem C hem de C++ kaynaklarıyla kullanılamaz.) Dosyanın içinde bir noktada ön derlemeyi durdurmak için makroyu BOUNDRY
kullanabilirsinizhdrstop
. Daha fazla bilgi için bkz. hdrstop
.
Diyagramda daha sonra, APPLIB.obj
son uygulamanızda kullanılan destek kodunu temsil eder. dosyasından, makroda UNSTABLEHDRS
listelenen dosyalar ve önceden derlenmiş üst bilgiden önceden derlenmiş kod oluşturulurAPPLIB.cpp
.
MYAPP.obj
son uygulamanızı temsil eder. dosyasından, makroda UNSTABLEHDRS
listelenen dosyalar ve önceden derlenmiş üst bilgiden önceden derlenmiş kod oluşturulurMYAPP.cpp
.
Son olarak, yürütülebilir dosya (MYAPP.EXE
) makroda OBJS
(APPLIB.obj
ve MYAPP.obj
) listelenen dosyalar bağlanarak oluşturulur.
PCH için örnek derleme dosyası
Aşağıdaki derleme dosyası, projenize uyarlamasını basitleştirmek için makroları ve bir !IF
, !ELSE
denetim !ENDIF
akışı komut yapısını kullanır.
# Makefile : Illustrates the effective use of precompiled
# headers in a project
# Usage: NMAKE option
# option: DEBUG=[0|1]
# (DEBUG not defined is equivalent to DEBUG=0)
#
OBJS = myapp.obj applib.obj
# List all stable header files in the STABLEHDRS macro.
STABLEHDRS = stable.h another.h
# List the final header file to be precompiled here:
BOUNDRY = stable.h
# List header files under development here:
UNSTABLEHDRS = unstable.h
# List all compiler options common to both debug and final
# versions of your code here:
CLFLAGS = /c /W3
# List all linker options common to both debug and final
# versions of your code here:
LINKFLAGS = /nologo
!IF "$(DEBUG)" == "1"
CLFLAGS = /D_DEBUG $(CLFLAGS) /Od /Zi
LINKFLAGS = $(LINKFLAGS) /COD
LIBS = slibce
!ELSE
CLFLAGS = $(CLFLAGS) /Oselg /Gs
LINKFLAGS = $(LINKFLAGS)
LIBS = slibce
!ENDIF
myapp.exe: $(OBJS)
link $(LINKFLAGS) @<<
$(OBJS), myapp, NUL, $(LIBS), NUL;
<<
# Compile myapp
myapp.obj : myapp.cpp $(UNSTABLEHDRS) stable.pch
$(CPP) $(CLFLAGS) /Yu$(BOUNDRY) myapp.cpp
# Compile applib
applib.obj : applib.cpp $(UNSTABLEHDRS) stable.pch
$(CPP) $(CLFLAGS) /Yu$(BOUNDRY) applib.cpp
# Compile headers
stable.pch : $(STABLEHDRS)
$(CPP) $(CLFLAGS) /Yc$(BOUNDRY) applib.cpp myapp.cpp
Derleme işlemindeki STABLEHDRS
PCH dosyalarında "Önceden Derlenmiş Üst Bilgi Dosyası Kullanan Derleme Dosyasının Yapısı" şeklinde gösterilen , BOUNDRY
ve UNSTABLEHDRS
makrolarının yanı sıra, bu derleme dosyası bir CLFLAGS
makro ve makro LINKFLAGS
sağlar. Uygulamanın yürütülebilir dosyasının hata ayıklamasını veya son sürümünü oluştururken geçerli olan derleyici ve bağlayıcı seçeneklerini listelemek için bu makroları kullanmanız gerekir. Ayrıca, projenizin gerektirdiği kitaplıkları listelediğiniz bir LIBS
makro da vardır.
Makefile ayrıca!IF
, NMAKE komut satırında bir DEBUG
simge tanımlayıp tanımlamamanızı algılamak için , !ELSE
kullanır!ENDIF
:
NMAKE DEBUG=[1|0]
Bu özellik, geliştirme sırasında ve programınızın son sürümleri için aynı derleme dosyasını kullanmanıza olanak sağlar. Son sürümler için kullanın DEBUG=0
. Aşağıdaki komut satırları eşdeğerdir:
NMAKE
NMAKE DEBUG=0
Derleme dosyaları hakkında daha fazla bilgi için bkz . NMAKE başvurusu. Ayrıca bkz. MSVC derleyici seçenekleri ve MSVC bağlayıcı seçenekleri.
PCH için örnek kod
Derleme işlemindeki PCH dosyalarında açıklanan derleme dosyasında ve PCH için örnek derleme dosyasında aşağıdaki kaynak dosyalar kullanılır. Açıklamalar önemli bilgiler içerir.
Kaynak dosya ANOTHER.H
:
// ANOTHER.H : Contains the interface to code that is not
// likely to change.
//
#ifndef __ANOTHER_H
#define __ANOTHER_H
#include<iostream>
void savemoretime( void );
#endif // __ANOTHER_H
Kaynak dosya STABLE.H
:
// STABLE.H : Contains the interface to code that is not likely
// to change. List code that is likely to change
// in the makefile's STABLEHDRS macro.
//
#ifndef __STABLE_H
#define __STABLE_H
#include<iostream>
void savetime( void );
#endif // __STABLE_H
Kaynak dosya UNSTABLE.H
:
// UNSTABLE.H : Contains the interface to code that is
// likely to change. As the code in a header
// file becomes stable, remove the header file
// from the makefile's UNSTABLEHDR macro and list
// it in the STABLEHDRS macro.
//
#ifndef __UNSTABLE_H
#define __UNSTABLE_H
#include<iostream>
void notstable( void );
#endif // __UNSTABLE_H
Kaynak dosya APPLIB.CPP
:
// APPLIB.CPP : This file contains the code that implements
// the interface code declared in the header
// files STABLE.H, ANOTHER.H, and UNSTABLE.H.
//
#include"another.h"
#include"stable.h"
#include"unstable.h"
using namespace std;
// The following code represents code that is deemed stable and
// not likely to change. The associated interface code is
// precompiled. In this example, the header files STABLE.H and
// ANOTHER.H are precompiled.
void savetime( void )
{ cout << "Why recompile stable code?\n"; }
void savemoretime( void )
{ cout << "Why, indeed?\n\n"; }
// The following code represents code that is still under
// development. The associated header file is not precompiled.
void notstable( void )
{ cout << "Unstable code requires"
<< " frequent recompilation.\n";
}
Kaynak dosya MYAPP.CPP
:
// MYAPP.CPP : Sample application
// All precompiled code other than the file listed
// in the makefile's BOUNDRY macro (stable.h in
// this example) must be included before the file
// listed in the BOUNDRY macro. Unstable code must
// be included after the precompiled code.
//
#include"another.h"
#include"stable.h"
#include"unstable.h"
int main( void )
{
savetime();
savemoretime();
notstable();
}
Ayrıca bkz.
Üst bilgi birimlerini, modülleri ve önceden derlenmiş üst bilgileri karşılaştırma
C/C++ derleme başvurusu
MSVC derleyici seçenekleriC++ içindeki modüllere genel bakış
Öğretici: Modülleri kullanarak C++ standart kitaplığını içeri aktarma
İzlenecek yol: Visual C++ projelerinizde üst bilgi birimleri oluşturma ve içeri aktarma
İzlenecek yol: STL kitaplıklarını üst bilgi birimi olarak içeri aktarma