C çalışma zamanı (CRT) ve C++ standart kitaplığı (STL) .lib
dosyaları
Bu makalede, uygulamanızı geliştirirken bağlanabileceğiniz Microsoft C çalışma zamanı kitaplık .lib
dosyaları ve bunların ilişkili derleyici seçenekleri ve önişlemci yönergeleri listelenir.
Uygulamanızı desteklemek için gerekli C çalışma zamanı dosyalarını dağıtma hakkında bilgi arıyorsanız bkz. Visual C++ dosyalarını yeniden dağıtma.
C çalışma zamanı kitaplığı için API başvurusu arıyorsanız bkz . C çalışma zamanı kitaplığı başvurusu .
Not
Microsoft'un C++ standart kitaplığını uygulaması genellikle STL veya Standart Şablon Kitaplığı olarak adlandırılır. C++ standart kitaplığı, ISO 14882'de tanımlandığı gibi kitaplığın resmi adı olsa da, arama motorlarında popüler "STL" ve "Standart Şablon Kitaplığı" kullanımı nedeniyle, belgelerimizi bulmayı kolaylaştırmak için bazen bu adları kullanırız.
Tarihsel açıdan bakıldığında ,"STL" ilk olarak Alexander Stepanov tarafından yazılan Standart Şablon Kitaplığı'na başvuruda bulundu. Bu kitaplığın bölümleri C++ standart kitaplığında standartlaştırıldı. Standart kitaplık ayrıca ISO C çalışma zamanı kitaplığını, Boost kitaplığının bölümlerini ve diğer işlevleri içerir. Bazen "STL", Stepanov'un STL'sinden uyarlanmış C++ standart kitaplığının kapsayıcı ve algoritma bölümlerine başvurmak için kullanılır. Bu belgelerde, Standart Şablon Kitaplığı (STL), C++ standart kitaplığını bir bütün olarak ifade eder.
C çalışma zamanı .lib
dosyaları
ISO C standart kitaplığı, C++ standart kitaplığının bir parçasıdır. CRT'yi uygulayan Visual C++ kitaplıkları yerel kod geliştirmeyi ve hem yerel hem de yönetilen kodun karmasını destekler. CRT'nin tüm sürümleri çok iş parçacıklı geliştirmeyi destekler. Kitaplıkların çoğu hem statik bağlamayı hem de kitaplığı doğrudan kodunuzla ilişkilendirmeyi veya kodunuzun ortak DLL dosyalarını kullanmasına izin vermek için dinamik bağlamayı destekler.
Visual Studio 2015'te CRT yeni ikili dosyalar halinde yeniden düzenlenmişti. Evrensel CRT (UCRT), standart C99 CRT kitaplığı tarafından dışarı aktarılan işlevleri ve global öğeleri içerir. UCRT artık bir Windows bileşenidir ve Windows 10 ve sonraki sürümlerin bir parçası olarak kullanıma sağlanır. UCRT için statik kitaplık, DLL içeri aktarma kitaplığı ve üst bilgi dosyaları artık Windows SDK'sında bulunur. Visual C++ yüklediğinizde, Visual Studio kurulumu UCRT'yi kullanmak için gereken Windows SDK'sının alt kümesini yükler. UCRT'yi Visual Studio 2015 ve sonraki sürümleri tarafından desteklenen herhangi bir Windows sürümünde kullanabilirsiniz. Windows 10 veya üzeri dışındaki desteklenen Windows sürümleri için vcredist kullanarak yeniden dağıtabilirsiniz. Daha fazla bilgi için bkz . Visual C++ Dosyalarını Yeniden Dağıtma.
Aşağıdaki tabloda UCRT'yi uygulayan kitaplıklar listelenir.
Kitaplık | İlişkili DLL | Özellikler | Seçenek | Ön işlemci yönergeleri |
---|---|---|---|---|
libucrt.lib |
Hiçbiri | UCRT'yi kodunuzla statik olarak bağlar. | /MT |
_MT |
libucrtd.lib |
Hiçbiri | Statik bağlantı için UCRT'nin sürümünde hata ayıklama. Yeniden dağıtılamaz. | /MTd |
_DEBUG , _MT |
ucrt.lib |
ucrtbase.dll |
UCRT için DLL içeri aktarma kitaplığı. | /MD |
_MT , _DLL |
ucrtd.lib |
ucrtbased.dll |
UCRT'nin Hata Ayıklama sürümü için DLL içeri aktarma kitaplığı. Yeniden dağıtılamaz. | /MDd |
_DEBUG , _MT , _DLL |
vcruntime kitaplığı Visual C++ CRT uygulamasına özgü kod içerir: özel durum işleme ve hata ayıklama desteği, çalışma zamanı denetimleri ve tür bilgileri, uygulama ayrıntıları ve belirli genişletilmiş kitaplık işlevleri. vcruntime kitaplığı sürümünün kullandığınız derleyici sürümüyle eşleşmesi gerekir.
Bu tabloda vcruntime kitaplığını uygulayan kitaplıklar listelenir.
Kitaplık | İlişkili DLL | Özellikler | Seçenek | Ön işlemci yönergeleri |
---|---|---|---|---|
libvcruntime.lib |
Hiçbiri | Kodunuzla statik olarak bağlantılı. | /MT |
_MT |
libvcruntimed.lib |
Hiçbiri | Statik bağlantı için hata ayıklama sürümü. Yeniden dağıtılamaz. | /MTd |
_MT , _DEBUG |
vcruntime.lib |
vcruntime<version>.dll |
vcruntime için DLL içeri aktarma kitaplığı. | /MD |
_MT , _DLL |
vcruntimed.lib |
vcruntime<version>d.dll |
Debug vcruntime için DLL içeri aktarma kitaplığı. Yeniden dağıtılamaz. | /MDd |
_DEBUG , _MT , _DLL |
Not
UCRT yeniden düzenlendiğinde Eşzamanlılık Çalışma Zamanı işlevleri C++ yeniden dağıtılabilir paketine eklenen içine taşındı concrt140.dll
. Bu DLL, C++ paralel kapsayıcıları ve gibi concurrency::parallel_for
algoritmalar için gereklidir. Ayrıca, C++ standart kitaplığı, Windows XP'de bu DLL'nin eşitleme temel öğelerini desteklemesini gerektirir çünkü Windows XP'de koşul değişkenleri yoktur.
CRT'yi başlatan kod, CRT kitaplığının statik veya dinamik olarak bağlı ya da yerel, yönetilen veya karma kod olmasına bağlı olarak çeşitli kitaplıklardan birindedir. Bu kod CRT başlatma, iş parçacığı başına iç veri başlatma ve sonlandırma işlemlerini işler. Kullanılan derleyicinin sürümüne özgüdür. Bu kitaplık, dinamik olarak bağlı bir UCRT kullanılırken bile her zaman statik olarak bağlanır.
Bu tabloda CRT başlatma ve sonlandırma uygulayan kitaplıklar listelenir.
Kitaplık | Özellikler | Seçenek | Ön işlemci yönergeleri |
---|---|---|---|
libcmt.lib |
Yerel CRT başlatmasını kodunuzla statik olarak bağlar. | /MT |
_MT |
libcmtd.lib |
Yerel CRT başlangıcının Hata ayıklama sürümünü statik olarak bağlar. Yeniden dağıtılamaz. | /MTd |
_DEBUG , _MT |
msvcrt.lib |
DLL UCRT ve vcruntime ile kullanılmak üzere yerel CRT başlangıcı için statik kitaplık. | /MD |
_MT , _DLL |
msvcrtd.lib |
DLL UCRT ve vcruntime ile kullanılmak üzere yerel CRT başlangıcının Hata ayıklama sürümü için statik kitaplık. Yeniden dağıtılamaz. | /MDd |
_DEBUG , _MT , _DLL |
msvcmrt.lib |
DLL UCRT ve vcruntime ile kullanılmak üzere karma yerel ve yönetilen CRT başlangıcı için statik kitaplık. | /clr |
|
msvcmrtd.lib |
DLL UCRT ve vcruntime ile kullanılmak üzere karma yerel ve yönetilen CRT başlangıcının Hata Ayıklama sürümü için statik kitaplık. Yeniden dağıtılamaz. | /clr |
|
msvcurt.lib |
Saf yönetilen CRT için kullanım dışı bırakılmış Statik kitaplık. | /clr:pure |
|
msvcurtd.lib |
Saf yönetilen CRT'nin Hata Ayıklama sürümü için kullanım dışı statik kitaplık. Yeniden dağıtılamaz. | /clr:pure |
Programınızı komut satırından C çalışma zamanı kitaplığını belirten bir derleyici seçeneği olmadan bağlarsanız, bağlayıcı statik olarak bağlı CRT kitaplıklarını kullanır: libcmt.lib
, libvcruntime.lib
ve libucrt.lib
.
Statik olarak bağlı CRT kullanılması, C çalışma zamanı kitaplığı tarafından kaydedilen tüm durum bilgilerinin CRT örneğinde yerel olacağını gösterir. Örneğin, statik olarak bağlı bir CRT kullanırken kullanırsanız strtok
ayrıştırıcının strtok
konumu, statik CRT'nin başka bir örneğine strtok
bağlı aynı işlemde (ancak farklı bir DLL veya EXE'de) kodda kullanılan durumla ilişkili değildir. Buna karşılık, dinamik olarak bağlı CRT, CRT'ye dinamik olarak bağlı bir işlem içindeki tüm kodlar için durumu paylaşır. Bu işlevlerin daha güvenli yeni sürümlerini kullanıyorsanız bu sorun geçerli değildir; örneğin, strtok_s
bu sorun yoktur.
Statik bir CRT'ye bağlanarak oluşturulan bir DLL'nin kendi CRT durumu olduğundan, sonuçları anlaşılmadığı ve istenmediği sürece DLL'deki CRT'ye statik olarak bağlanmanızı önermeyiz. Örneğin, dll dosyasını kendi statik CRT'sine yükleyen bir yürütülebilir dosyayı çağırırsanız _set_se_translator
, DLL'deki kod tarafından oluşturulan tüm donanım özel durumları çevirici tarafından yakalanmaz, ancak ana yürütülebilir dosyada kod tarafından oluşturulan donanım özel durumları yakalanır.
Derleyici anahtarını kullanıyorsanız /clr
kodunuz statik kitaplığıyla msvcmrt.lib
(. Statik kitaplık, yönetilen kodunuz ile yerel CRT arasında bir ara sunucu sağlar. ile /clr
statik olarak bağlı CRT 'yi ( /MT
veya /MTd
seçenekleri) kullanamazsınız. Bunun yerine dinamik olarak bağlı kitaplıkları (/MD
veya /MDd
) kullanın. Saf yönetilen CRT kitaplıkları Visual Studio 2015'te kullanım dışıdır ve Visual Studio 2017'de desteklenmez.
CRT'yi ile /clr
kullanma hakkında daha fazla bilgi için bkz . Karma (Yerel ve Yönetilen) Derlemeler.
Uygulamanızın hata ayıklama sürümünü oluşturmak için bayrağı tanımlanmalıdır _DEBUG
ve uygulamanın bu kitaplıklardan birinin hata ayıklama sürümüyle bağlanması gerekir. Kitaplık dosyalarının hata ayıklama sürümlerini kullanma hakkında daha fazla bilgi için bkz . CRT hata ayıklama teknikleri.
CRT'nin bu sürümü C99 standardıyla tam olarak uyumlu değildir. Visual Studio 2019 sürüm 16.8'in <tgmath.h>
önceki sürümlerinde üst bilgi desteklenmez. Tüm sürümlerde CX_LIMITED_RANGE
ve FP_CONTRACT
pragma makroları desteklenmez. Standart GÇ işlevlerindeki parametre tanımlayıcılarının anlamı gibi bazı öğeler varsayılan olarak eski yorumları kullanır. Derleyici uyumluluk seçeneklerini kullanabilir /Zc
ve kitaplık uyumluluğunun bazı yönlerini denetlemek için bağlayıcı seçenekleri belirtebilirsiniz.
C++ standart kitaplık (STL) .lib
dosyaları
C++ standart kütüphanesi | Özellikler | Seçenek | Ön işlemci yönergeleri |
---|---|---|---|
libcpmt.lib |
Çok iş parçacıklı, statik bağlantı | /MT |
_MT |
msvcprt.lib |
Çok iş parçacıklı, dinamik bağlantı (için msvcp<version>.dll içeri aktarma kitaplığı) |
/MD |
_MT , _DLL |
libcpmtd.lib |
Çok iş parçacıklı, statik bağlantı | /MTd |
_DEBUG , _MT |
msvcprtd.lib |
Çok iş parçacıklı, dinamik bağlantı (için msvcp<version>d.dll içeri aktarma kitaplığı) |
/MDd |
_DEBUG , _MT , _DLL |
Projenizin yayın sürümünü oluşturduğunuzda, seçtiğiniz derleyici seçeneğine (libcmt.lib
çok iş parçacıklı, DLL, /clr
) bağlı olarak temel C çalışma zamanı kitaplıklarından (, msvcmrt.lib
, msvcrt.lib
) biri varsayılan olarak bağlanır. Kodunuza C++ standart kitaplık üst bilgi dosyalarından birini eklerseniz, derleme zamanında C++ standart kitaplığı Visual C++ tarafından otomatik olarak bağlanır. Örneğin:
#include <ios>
İkili uyumluluk için, tek bir içeri aktarma kitaplığı tarafından birden fazla DLL dosyası belirtilebilir. Sürüm güncelleştirmeleri nokta kitaplıkları, yeni kitaplık işlevselliği sağlayan ayrı DLL'ler sunabilir. Örneğin, Visual Studio 2017 sürüm 15.6 tarafından msvcp140.dll
desteklenen Uygulama İkili Arabirimini (ABI) bozmadan daha standart kitaplık işlevselliğini desteklemek için kullanıma sunulmuşturmsvcp140_1.dll
. msvcprt.lib
Visual Studio 2017 sürüm 15.6 araç takımına dahil edilen içeri aktarma kitaplığı her iki DLL'yi de destekler ve bu sürümdeki vcredist her iki DLL'yi de yükler. Bir nokta kitaplığı gönderildikten sonra sabit bir ABI'ye sahiptir ve sonraki nokta kitaplığına hiçbir zaman bağımlı olmaz.
Bir uygulama birden fazla CRT sürümü kullanıyorsa hangi sorunlar vardır?
Her yürütülebilir görüntünün (EXE veya DLL) statik olarak bağlı kendi CRT'si olabilir veya bir CRT'ye dinamik olarak bağlanabilir. CRT'nin statik olarak dahil edilen veya belirli bir görüntü tarafından dinamik olarak yüklenen sürümü, birlikte oluşturulduğu araçların ve kitaplıkların sürümüne bağlıdır. Tek bir işlem, her biri kendi CRT'si olan birden çok EXE ve DLL görüntüsü yükleyebilir. Bu CRT'lerin her biri farklı bir ayırıcı kullanabilir, farklı iç yapı düzenlerine sahip olabilir ve farklı depolama düzenlemeleri kullanabilir. Bu, ayrılmış bellek, CRT kaynakları veya DLL sınırı üzerinden geçirilen sınıfların bellek yönetiminde, iç statik kullanımda veya düzen yorumunda sorunlara neden olabileceği anlamına gelir. Örneğin, bir sınıf bir DLL'de ayrılır ancak başka bir DLL'ye geçirilip başka bir tarafından silinirse, hangi CRT serbest bırakıcısı kullanılır? Neden olan hatalar hafiften hemen önemli olana kadar değişebilir ve bu nedenle bu tür kaynakların doğrudan aktarımı önerilmez.
Kararlı ve sürümlenebilir olacak şekilde tasarlandıklarından, bunun yerine Uygulama İkili Arabirimi (ABI) teknolojilerini kullanarak bu sorunların birçoğundan kaçınabilirsiniz. DLL dışarı aktarma arabirimlerinizi değere göre bilgi geçirmek veya yerel olarak ayrılıp çağırana döndürülmek yerine çağıran tarafından geçirilen bellek üzerinde çalışmak için tasarlar. Yürütülebilir görüntüler arasında yapılandırılmış verileri kopyalamak için hazırlama tekniklerini kullanın. Kaynakları yerel olarak kapsüller ve yalnızca istemcilerin kullanımına açık olan tanıtıcılar veya işlevler aracılığıyla işlemeye izin verir.
İşleminizdeki tüm görüntüler aynı dinamik olarak yüklenen CRT sürümünü kullanıyorsa bu sorunlardan bazılarını önlemek de mümkündür. Tüm bileşenlerin CRT'nin aynı DLL sürümünü kullandığından emin olmak için, seçeneğini kullanarak /MD
bunları derleyin ve aynı derleyici araç takımını ve özellik ayarlarını kullanın.
Programınız belirli CRT kaynaklarını DLL sınırları boyunca geçirirse dikkatli olun. Dosya tanıtıcıları, yerel ayarlar ve ortam değişkenleri gibi kaynaklar, CRT'nin aynı sürümünü kullanırken bile sorunlara neden olabilir. İlgili sorunlar ve bunların nasıl çözüleceğini öğrenmek için bkz . DLL sınırlarında CRT nesnelerini geçirirken olası hatalar.
Ayrıca bkz.
C çalışma zamanı kitaplığı başvurusu
Visual C++ Dosyalarını Yeniden Dağıtma