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_foralgoritmalar 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.libve 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 /clrstatik 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 /clrkullanma 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>.dlliç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.dlliç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.dlldesteklenen 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