Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Visual Studio'da yeni bir proje oluşturduğunuzda, projeye önceden derlenmiş başlık dosyası olarak adlandırılan bir pch.h 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. Kararlı başlık dosyaları, örneğin Standart Kitaplık başlıkları gibi <vector>, buraya eklenmelidir. Önceden derlenmiş başlık dosyası yalnızca kendisi veya içerdiği dosyalardan herhangi biri değiştirildiğinde derlenir. Proje kaynak kodunuzda yalnızca değişiklik yaparsanız, yapı önceden derlenmiş başlık dosyası 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ş Başlıklar 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 include dosyaları tek bir önceden derlenmiş başlık dosyası altında önceden derlenebilir. Dahil etme dosyalarını ele almanın daha yeni yolları hakkında daha fazla bilgi için Üst bilgi birimlerini, modülleri ve önceden derlenmiş üst bilgileri karşılaştırma başlığını inceleyin.
İ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.
tr-TR: Kod ön derlemesi yapın, eğer kaynak dosyalarınızın ortak başlık dosyası kümeleri kullandığını biliyorsanız veya ön derlemenize kaynak kodu eklemek istiyorsanız.
Ö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).
/Yc kullanarak önceden derlenmiş bir üst bilgi oluşturun. İ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ş bir başlık dosyasını kullanmak için /Yu seçin. Önceden derlenmiş üst bilgi için alternatif bir ad sağlamak amacıyla, /Fp ile /Yc ve /Yu seçeneklerini de kullanabilirsiniz.
/Yu ve /Yc için derleyici seçeneği başvuru makalelerinde, geliştirme ortamında bu işlevselliğe nasıl erişileceği tartışılır.
Önceden derlenmiş başlık 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, uyarı verip mümkünse 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ı,
/Eve/EPseçenekleriyle ç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 başlık 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ı
Önceden /Yc veya /Yu kullanılarak oluşturulan derlenmiş bir başlık kullandığınızda, derleyici geçerli derleme ortamını PCH dosyasını oluşturduğunuz zamanki ortamla 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, uyarı verip mümkünse 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 /E veya /EP seçeneğiyle çalışmaz. |
/Fr veya /FR |
Microsoft Source Browser bilgileri oluşturma |
/Fr ve /FR seçeneklerinin /Yu seçeneğiyle birlikte geçerli olabilmesi için, önceden derlenmiş üst bilginin oluşturulduğu anda 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, /Gwveya /GW |
Windows protokolü seçenekleri | Önceden derlenmiş başlık dosyasını oluşturan derleme ile geçerli derleme 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 mevcut nesne dosyasına yerleştirilir ve önceden derlenmiş üst bilgide tanımlanan yerel simgeler hata ayıklama aracı 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.
Şekil, inşa sürecinin akışını göstermek için üç diyagramatik araç kullanı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 makefile yapısı:
Diyagramda, '$(STABLEHDRS)' ve '$(BOUNDRY)' öğelerinin CL /c /W3 /Yc$(BOUNDRY) applib.cpp myapp.cpp'a giriş sağladığı gösterilmektedir. Bunun çıktısı $(STABLE.PCH) olan. Ardından applib.cpp, $(UNSTABLEHDRS) ve $(STABLE.PCH), applib.obj'u üretmek üzere CL /c /w3 /Yu $(BOUNDRY) applib.cpp ile derlenir. myapp.cpp, $(UNSTABLEHDR) ve $(STABLE.PCH) de aynı şekilde CL /c /w3 /Yu $(BOUNDRY) myapp.cpp komutu ile derlenerek myapp.obj'u üretir. Son olarak, applib.obj ve myapp.obj, myapp.exe'yi oluşturmak için LINK /NOD ONERROR:NOEXE $(OBJS), myapp, NUL, $(LIBS), NUL kullanılarak birleştirilir.
Diyagramın en üstünden başlayarak, STABLEHDRS ve BOUNDRY dosyaları, yeniden derlenmesine gerek duyulması muhtemel olmayan dosyaları 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ş başlık 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. Önceden derlenmiş olmasını istediğiniz son dosyayı BOUNDRY makrosunda 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 hdrstop kullanabilirsinizBOUNDRY. Daha fazla bilgi için bkz. hdrstop.
Diyagramda daha sonra, APPLIB.obj son uygulamanızda kullanılan destek kodunu temsil eder.
APPLIB.cpp makrosunda listelenen dosyalar, dosya ve önceden derlenmiş üst bilgiden elde edilen önceden derlenmiş kod kullanılarak oluşturulur.
MYAPP.obj son uygulamanızı temsil eder. O MYAPP.cpp bileşeni, UNSTABLEHDRS makrosunda listelenen dosyalar ve önceden derlenmiş başlıktan gelen kod ile oluşturulur.
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, !ELSEdenetim !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 "Önyüklü Başlık Dosyasını Kullanan Bir Makefile'in Yapısı" adlı şekilde gösterilen STABLEHDRS, BOUNDRY ve UNSTABLEHDRS makrolarının yanı sıra, bu makefile bir CLFLAGS makrosu ve bir LINKFLAGS makrosu 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 NMAKE komut satırında bir DEBUG simgesi tanımlayıp tanımlamadığınızı algılamak için !IF, !ELSE, !ENDIF kullanır.
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 referansı. 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 referansı
MSVC derleyici seçenekleri
C++ içindeki modüllere genel bakış
Öğretici: Modülleri kullanarak C++ standart kitaplığını içeri aktarma
Kılavuz: Microsoft C++ projelerinizde başlık birimleri oluşturma ve içeri aktarma
İzlenecek yol: STL kitaplıklarını üst bilgi birimi olarak içeri aktarma