C/C++ programları bildirim üretimini anlama
Bildirim, bir derlemeyi benzersiz olarak tanımlayan bir XML belgesidir. COM sınıfları, arabirimler ve tür kitaplıkları gibi bağlama ve etkinleştirme için kullanılan bilgileri içerir. Bildirim bir dış XML dosyası veya bir uygulama veya derleme içine eklenmiş bir kaynak olabilir. Yalıtılmış bir uygulamanın bildirimi, uygulamanın çalışma zamanında bağlanması gereken paylaşılan yan yana derlemelerin adlarını ve sürümlerini yönetmek için kullanılır. Yan yana derleme bildirimi adlara, sürümlere, kaynaklara ve diğer derlemelere bağımlılıklarını belirtir.
Yalıtılmış bir uygulama veya yan yana derleme için bildirim oluşturmanın iki yolu vardır. İlk olarak, derlemenin yazarı kuralları ve adlandırma gereksinimlerini izleyerek el ile bir bildirim dosyası oluşturabilir. Daha fazla bilgi için bkz . Bildirim dosyaları başvurusu. Alternatif olarak, bir program yalnızca CRT, MFC, ATL veya diğerleri gibi MSVC derlemelerine bağımlıysa, bağlayıcı otomatik olarak bir bildirim oluşturabilir.
MSVC kitaplıklarının üst bilgileri derleme bilgilerini içerir ve kitaplıklar uygulama koduna eklendiğinde bu derleme bilgileri bağlayıcı tarafından son ikili dosya için bir bildirim oluşturmak için kullanılır. Bağlayıcı varsayılan olarak bildirim dosyasını ikili dosyaya eklemez. Bildirimin dış dosya olarak olması tüm senaryolarda çalışmayabilir. Örneğin, özel derlemelerde ekli bildirimler olması önerilir. Kod oluşturmak için NMAKE kullananlar gibi komut satırı derlemelerinde, bildirimi eklemek için bağlayıcı seçeneğini kullanabilirsiniz /MANIFEST:EMBED
. Alternatif olarak, bildirim aracı kullanılarak bir bildirim eklenebilir. Daha fazla bilgi için komut satırında bildirim oluşturma bölümüne bakın. Visual Studio'da derleme yaparken, sonraki bölümde açıklandığı gibi, Proje Özellikleri iletişim kutusundaki bildirim aracı için bir özellik ayarlanarak bir bildirim eklenebilir.
Visual Studio'da bildirim oluşturma
Visual Studio'ya projenin Özellik Sayfaları iletişim kutusunda belirli bir proje için bildirim dosyası oluşturmasını söyleyebilirsiniz. Yapılandırma Özellikleri'nin altında Bağlayıcı>Bildirim Dosyası>Oluştur Bildirimi'ni seçin. Varsayılan olarak, yeni projelerin proje özellikleri bir bildirim dosyası oluşturacak şekilde ayarlanır. Ancak, projenin Bildirim Oluştur özelliğini kullanarak bir proje için bildirimin oluşturulmasını devre dışı bırakmak mümkündür. Bu özellik Evet olarak ayarlandığında, projenin bildirimi oluşturulur. Aksi takdirde bağlayıcı, uygulama kodunun bağımlılıklarını çözerken derleme bilgilerini yoksayar ve bildirimi oluşturmaz.
Visual Studio'daki derleme sistemi, bildirimin son ikili uygulama dosyasına katıştırılmasına veya dış dosya olarak oluşturulmasına izin verir. Bu davranış, Proje Özellikleri iletişim kutusundaki Ekleme Bildirimi seçeneği tarafından denetlenır. Bu özelliği ayarlamak için Bildirim Aracı düğümünü açın, ardından Giriş ve Çıkış'ı seçin. Bildirim eklenmemişse, dış dosya olarak oluşturulur ve son ikili dosyayla aynı dizine kaydedilir. Bildirim eklenmişse, Visual Studio aşağıdaki işlemi kullanarak son bildirimleri ekler:
Kaynak kod nesne dosyalarına derlendiğinde bağlayıcı bağımlı derleme bilgilerini toplar. Bağlayıcı son ikiliyi bağlasa da, daha sonra son bildirimi oluşturmak için kullanılan bir ara bildirim oluşturur.
Ara bildirim ve bağlama tamamlandıktan sonra bildirim aracı son bildirimi birleştirir ve dış dosya olarak kaydeder.
Proje derleme sistemi daha sonra bildirim aracı tarafından oluşturulan bildirimin ikili dosyaya eklenmiş olan bildirimden farklı bilgiler içerip içermediğini algılar.
İkili dosyaya eklenen bildirim bildirim aracı tarafından oluşturulan bildirimden farklıysa veya ikili ekli bir bildirim içermiyorsa, Visual Studio dış bildirim dosyasını ikili dosyanın içine kaynak olarak eklemek için bağlayıcıyı bir kez daha çağırır.
İkili dosyaya eklenen bildirim, bildirim aracı tarafından oluşturulan bildirimle aynıysa, derleme sonraki derleme adımlarına devam eder.
Bildirim, metin kaynağı olarak son ikili dosyaya eklenir. Son ikili dosyayı Visual Studio'da dosya olarak açarak görüntüleyebilirsiniz. Bildirimin doğru kitaplıklara işaret etmesini sağlamak için Visual C++ uygulamasının bağımlılıklarını anlama başlığı altında açıklanan adımları izleyin. Veya Sorun giderme makalesinde açıklanan önerileri izleyin.
Komut satırında bildirim üretme
NMAKE veya benzer araçları kullanarak komut satırından C/C++ uygulamaları oluşturduğunuzda, bağlayıcı tüm nesne dosyalarını işledikten ve son ikiliyi oluşturduktan sonra bildirim oluşturulur. Bağlayıcı, nesne dosyalarında depolanan derleme bilgilerini toplar ve bu bilgileri son bildirim dosyasında birleştirir. Bağlayıcı varsayılan olarak, son ikiliyi açıklamak için adlı <binary_name>.<extension>.manifest
bir dosya oluşturur. Bağlayıcı, bağlayıcı seçeneğini belirterek /MANIFEST:EMBED
ikili dosyanın içine bir bildirim dosyası ekleyebilir.
Bildirim aracını (mt.exe
) kullanma veya bildirimi bir kaynak dosyasına derleme gibi son ikili dosyaya bildirim eklemenin birkaç yolu daha vardır. Artımlı bağlama, imzalama ve Düzenle ve Devam Et gibi özellikleri etkinleştirmek için bir bildirim eklerken belirli kurallara uymanız gerekir. Bu kurallar ve diğer seçenekler sonraki bölümde açıklanmıştır.
C/C++ uygulamasının içine bildirim ekleme
Uygulamanızın veya kitaplığınızın bildirimini son ikili dosyaya eklemenizi öneririz. Bu yaklaşım çoğu senaryoda doğru çalışma zamanı davranışını garanti eder. Varsayılan olarak, Visual Studio bir proje oluştururken bildirimi eklemeye çalışır. Ancak, uygulamanızı NMAKE kullanarak derlerseniz, derleme dosyasında bazı değişiklikler yapmanız gerekir. Bu bölümde, bildirimi son ikili dosyaya otomatik olarak ekleyebilmesi için derleme dosyalarının nasıl değiştirildiğini gösterir.
İki yaklaşım
Bildirimi bir uygulama veya kitaplığın içine eklemenin iki yolu vardır.
Artımlı derleme yapmıyorsanız, derleme sonrası adım olarak aşağıdakine benzer bir komut satırı kullanarak bildirimi doğrudan ekleyebilirsiniz:
mt.exe -manifest MyApp.exe.manifest -outputresource:MyApp.exe;1
veya
mt.exe -manifest MyLibrary.dll.manifest -outputresource:MyLibrary.dll;2
EXE için 1 ve DLL için 2 kullanın.
Artımlı derleme yapıyorsanız aşağıdaki adımları kullanın:
Dosyayı oluşturmak için ikili dosyayı bağlayın
MyApp.exe.manifest
.Bildirimi bir kaynak dosyasına dönüştürün.
Bildirim kaynağını ikili dosyaya eklemek için yeniden bağlama (artımlı olarak).
Aşağıdaki örneklerde, her iki tekniği de içerecek şekilde derleme dosyalarının nasıl değiştireceği gösterilmektedir.
Derleme dosyaları (Önce)
tek bir dosyadan oluşturulmuş basit bir uygulama olan için MyApp.exe
NMAKE betiğini göz önünde bulundurun:
# build MyApp.exe
!if "$(DEBUG)" == "1"
CPPFLAGS=$(CPPFLAGS) /MDd
LFLAGS=$(LFLAGS) /INCREMENTAL
!else
CPPFLAGS=$(CPPFLAGS) /MD
!endif
MyApp.exe : MyApp.obj
link $** /out:$@ $(LFLAGS)
MyApp.obj : MyApp.cpp
clean :
del MyApp.obj MyApp.exe
Bu betik Visual Studio ile değiştirilmeden çalıştırılırsa, başarıyla oluşturur MyApp.exe
. Ayrıca çalışma zamanında bağımlı derlemeleri yüklemek üzere işletim sistemi tarafından kullanılmak üzere dış bildirim dosyasını MyApp.exe.manifest
oluşturur.
için MyLibrary.dll
NMAKE betiği benzer görünür:
# build MyLibrary.dll
!if "$(DEBUG)" == "1"
CPPFLAGS=$(CPPFLAGS) /MDd
LFLAGS=$(LFLAGS) /DLL /INCREMENTAL
!else
CPPFLAGS=$(CPPFLAGS) /MD
LFLAGS=$(LFLAGS) /DLL
!endif
MyLibrary.dll : MyLibrary.obj
link $** /out:$@ $(LFLAGS)
MyLibrary.obj : MyLibrary.cpp
clean :
del MyLibrary.obj MyLibrary.dll
Derleme dosyaları (Sonra)
Eklenmiş bildirimlerle derlemek için özgün derleme dosyalarında dört küçük değişiklik yapmanız gerekir. Makefile için MyApp.exe
:
# build MyApp.exe
!include makefile.inc
#^^^^^^^^^^^^^^^^^^^^ Change #1. (Add full path if necessary.)
!if "$(DEBUG)" == "1"
CPPFLAGS=$(CPPFLAGS) /MDd
LFLAGS=$(LFLAGS) /INCREMENTAL
!else
CPPFLAGS=$(CPPFLAGS) /MD
!endif
MyApp.exe : MyApp.obj
link $** /out:$@ $(LFLAGS)
$(_VC_MANIFEST_EMBED_EXE)
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Change #2
MyApp.obj : MyApp.cpp
clean :
del MyApp.obj MyApp.exe
$(_VC_MANIFEST_CLEAN)
#^^^^^^^^^^^^^^^^^^^^^^^^ Change #3
!include makefile.target.inc
#^^^^^^^^^^^^^^^^^^^^^^^^^ Change #4. (Add full path if necessary.)
MyLibrary.dll derleme dosyası için:
# build MyLibrary.dll
!include makefile.inc
#^^^^^^^^^^^^^^^^^^^^ Change #1. (Add full path if necessary.)
!if "$(DEBUG)" == "1"
CPPFLAGS=$(CPPFLAGS) /MDd
LFLAGS=$(LFLAGS) /DLL /INCREMENTAL
!else
CPPFLAGS=$(CPPFLAGS) /MD
LFLAGS=$(LFLAGS) /DLL
!endif
MyLibrary.dll : MyLibrary.obj
link $** /out:$@ $(LFLAGS)
$(_VC_MANIFEST_EMBED_DLL)
#^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Change #2.
MyLibrary.obj : MyLibrary.cpp
clean :
del MyLibrary.obj MyLibrary.dll
$(_VC_MANIFEST_CLEAN)
#^^^^^^^^^^^^^^^^^^^^^^^^ Change #3.
!include makefile.target.inc
#^^^^^^^^^^^^^^^^^^^^^^^^^ Change #4. (Add full path if necessary.)
Derleme dosyaları artık gerçek işi makefile.inc
yapacak iki dosya içerir ve makefile.target.inc
.
Aşağıdaki içeriği oluşturun makefile.inc
ve içine kopyalayın:
# makefile.inc -- Include this file into existing makefile at the very top.
# _VC_MANIFEST_INC specifies whether build is incremental (1 - incremental).
# _VC_MANIFEST_BASENAME specifies name of a temporary resource file.
!if "$(DEBUG)" == "1"
CPPFLAGS=$(CPPFLAGS) /MDd
LFLAGS=$(LFLAGS) /INCREMENTAL
_VC_MANIFEST_INC=1
_VC_MANIFEST_BASENAME=__VC90.Debug
!else
CPPFLAGS=$(CPPFLAGS) /MD
_VC_MANIFEST_INC=0
_VC_MANIFEST_BASENAME=__VC90
!endif
####################################################
# Specifying name of temporary resource file used only in incremental builds:
!if "$(_VC_MANIFEST_INC)" == "1"
_VC_MANIFEST_AUTO_RES=$(_VC_MANIFEST_BASENAME).auto.res
!else
_VC_MANIFEST_AUTO_RES=
!endif
####################################################
# _VC_MANIFEST_EMBED_EXE - command to embed manifest in EXE:
!if "$(_VC_MANIFEST_INC)" == "1"
#MT_SPECIAL_RETURN=1090650113
#MT_SPECIAL_SWITCH=-notify_resource_update
MT_SPECIAL_RETURN=0
MT_SPECIAL_SWITCH=
_VC_MANIFEST_EMBED_EXE= \
if exist $@.manifest mt.exe -manifest $@.manifest -out:$(_VC_MANIFEST_BASENAME).auto.manifest $(MT_SPECIAL_SWITCH) & \
if "%ERRORLEVEL%" == "$(MT_SPECIAL_RETURN)" \
rc /r $(_VC_MANIFEST_BASENAME).auto.rc & \
link $** /out:$@ $(LFLAGS)
!else
_VC_MANIFEST_EMBED_EXE= \
if exist $@.manifest mt.exe -manifest $@.manifest -outputresource:$@;1
!endif
####################################################
# _VC_MANIFEST_CLEAN - command to clean resources files generated temporarily:
!if "$(_VC_MANIFEST_INC)" == "1"
_VC_MANIFEST_CLEAN=-del $(_VC_MANIFEST_BASENAME).auto.res \
$(_VC_MANIFEST_BASENAME).auto.rc \
$(_VC_MANIFEST_BASENAME).auto.manifest
!else
_VC_MANIFEST_CLEAN=
!endif
# End of makefile.inc
####################################################
Şimdi aşağıdaki içeriği oluşturun makefile.target.inc
ve içine kopyalayın:
# makefile.target.inc - include this at the very bottom of the existing makefile
####################################################
# Commands to generate initial empty manifest file and the RC file
# that references it, and for generating the .res file:
$(_VC_MANIFEST_BASENAME).auto.res : $(_VC_MANIFEST_BASENAME).auto.rc
$(_VC_MANIFEST_BASENAME).auto.rc : $(_VC_MANIFEST_BASENAME).auto.manifest
type <<$@
#include <winuser.h>
1RT_MANIFEST"$(_VC_MANIFEST_BASENAME).auto.manifest"
<< KEEP
$(_VC_MANIFEST_BASENAME).auto.manifest :
type <<$@
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
</assembly>
<< KEEP
# end of makefile.target.inc
Ayrıca bkz.
C/C++ yalıtılmış uygulamaları ve yan yana derlemeleri oluşturma
Yalıtılmış uygulamalar ve yan yana derlemeler kavramları
C/C++ yalıtılmış uygulamaları ve yan yana derlemelerle ilgili sorunları giderme
/INCREMENTAL
(Artımlı bağlantı)
/MANIFEST
(Yan yana derleme bildirimi oluşturma)
Tanımlayıcı Ad derlemeleri (Derleme imzalama) (C++/CLI)
Düzenle ve Devam Et