File runtime C (CRT) dan pustaka standar C++ (STL) .lib

Artikel ini mencantumkan file pustaka .lib runtime Microsoft C yang dapat Anda tautkan saat mengembangkan aplikasi, dan opsi kompilator terkait dan arahan prapemrosersornya.

Lihat Mendistribusikan ulang file Visual C++ jika Anda mencari informasi tentang menyebarkan file runtime C yang diperlukan untuk mendukung aplikasi Anda.

Lihat Referensi pustaka runtime C jika Anda mencari referensi API untuk pustaka runtime C.

Catatan

Implementasi Microsoft dari pustaka standar C++ sering disebut sebagai STL atau Pustaka Templat Standar. Meskipun pustaka standar C++ adalah nama resmi pustaka seperti yang didefinisikan dalam ISO 14882, karena penggunaan populer "STL" dan "Standard Template Library" di mesin pencari, kami kadang-kadang menggunakan nama-nama tersebut untuk mempermudah menemukan dokumentasi kami.

Dari perspektif historis, "STL" awalnya mengacu pada Pustaka Templat Standar yang ditulis oleh Alexander Stepanov. Bagian dari pustaka tersebut distandarisasi di pustaka standar C++. Pustaka standar juga menggabungkan pustaka runtime ISO C, bagian dari pustaka Boost, dan fungsionalitas lainnya. Terkadang "STL" digunakan untuk merujuk ke bagian kontainer dan algoritma dari pustaka standar C++ yang diadaptasi dari STL Stepanov. Dalam dokumentasi ini, Pustaka Templat Standar (STL) mengacu pada pustaka standar C++ secara keseluruhan.

File runtime .lib C

Pustaka standar ISO C adalah bagian dari pustaka standar C++. Pustaka Visual C++ yang mengimplementasikan CRT mendukung pengembangan kode asli, dan kode asli campuran dan terkelola. Semua versi CRT mendukung pengembangan multi-utas. Sebagian besar pustaka mendukung penautan statis, untuk menautkan pustaka langsung ke kode Anda, atau penautan dinamis untuk memungkinkan kode Anda menggunakan file DLL umum.

Di Visual Studio 2015, CRT direfaktor menjadi biner baru. Universal CRT (UCRT) berisi fungsi dan global yang diekspor oleh pustaka C99 CRT standar. UCRT sekarang menjadi komponen Windows, dan dikirim sebagai bagian dari Windows 10 dan versi yang lebih baru. Pustaka statis, pustaka impor DLL, dan file header untuk UCRT sekarang ditemukan di Windows SDK. Saat Anda menginstal Visual C++, penyiapan Visual Studio menginstal subset Windows SDK yang diperlukan untuk menggunakan UCRT. Anda dapat menggunakan UCRT pada versi Windows apa pun yang didukung oleh Visual Studio 2015 dan versi yang lebih baru. Anda dapat mendistribusikannya kembali menggunakan vcredist untuk versi Windows yang didukung selain Windows 10 atau yang lebih baru. Untuk informasi selengkapnya, lihat Mendistribusikan ulang File Visual C++.

Tabel berikut mencantumkan pustaka yang mengimplementasikan UCRT.

Pustaka DLL terkait Karakteristik Opsi Arahan pra-prosesor
libucrt.lib Tidak ada Secara statis menautkan UCRT ke dalam kode Anda. /MT _MT
libucrtd.lib Tidak ada Versi debug UCRT untuk penautan statis. Tidak dapat didistribusikan ulang. /MTd _DEBUG, _MT
ucrt.lib ucrtbase.dll DLL mengimpor pustaka untuk UCRT. /MD _MT, _DLL
ucrtd.lib ucrtbased.dll Pustaka impor DLL untuk versi Debug UCRT. Tidak dapat didistribusikan ulang. /MDd _DEBUG, _MT, _DLL

Pustaka vcruntime berisi kode khusus implementasi C++ CRT Visual: penanganan pengecualian dan dukungan debugging, pemeriksaan runtime dan informasi jenis, detail implementasi, dan fungsi pustaka tertentu yang diperluas. Versi pustaka vcruntime perlu cocok dengan versi pengkompilasi yang Anda gunakan.

Tabel ini mencantumkan pustaka yang mengimplementasikan pustaka vcruntime.

Pustaka DLL terkait Karakteristik Opsi Arahan pra-prosesor
libvcruntime.lib Tidak ada Secara statis ditautkan ke dalam kode Anda. /MT _MT
libvcruntimed.lib Tidak ada Versi debug untuk penautan statis. Tidak dapat didistribusikan ulang. /MTd _MT, _DEBUG
vcruntime.lib vcruntime<version>.dll DLL mengimpor pustaka untuk vcruntime. /MD _MT, _DLL
vcruntimed.lib vcruntime<version>d.dll Pustaka impor DLL untuk vcruntime Debug. Tidak dapat didistribusikan ulang. /MDd _DEBUG, _MT, _DLL

Catatan

Ketika UCRT direfaktor, fungsi Runtime Konkurensi dipindahkan ke concrt140.dll, yang ditambahkan ke paket yang dapat didistribusikan ulang C++. DLL ini diperlukan untuk kontainer dan algoritma paralel C++ seperti concurrency::parallel_for. Selain itu, pustaka standar C++ memerlukan DLL ini pada Windows XP untuk mendukung primitif sinkronisasi, karena Windows XP tidak memiliki variabel kondisi.

Kode yang menginisialisasi CRT berada di salah satu dari beberapa pustaka, berdasarkan apakah pustaka CRT ditautkan secara statis atau dinamis, atau kode asli, terkelola, atau campuran. Kode ini menangani startup CRT, inisialisasi data internal per alur, dan penghentian. Ini khusus untuk versi pengkompilasi yang digunakan. Pustaka ini selalu ditautkan secara statis, bahkan saat menggunakan UCRT yang ditautkan secara dinamis.

Tabel ini mencantumkan pustaka yang menerapkan inisialisasi dan penghentian CRT.

Pustaka Karakteristik Opsi Arahan pra-prosesor
libcmt.lib Secara statis menautkan startup CRT asli ke dalam kode Anda. /MT _MT
libcmtd.lib Secara statis menautkan versi Debug dari startup CRT asli. Tidak dapat didistribusikan ulang. /MTd _DEBUG, _MT
msvcrt.lib Pustaka statis untuk startup CRT asli untuk digunakan dengan DLL UCRT dan vcruntime. /MD _MT, _DLL
msvcrtd.lib Pustaka statis untuk versi Debug startup CRT asli untuk digunakan dengan DLL UCRT dan vcruntime. Tidak dapat didistribusikan ulang. /MDd _DEBUG, _MT, _DLL
msvcmrt.lib Pustaka statis untuk startup CRT asli campuran dan terkelola untuk digunakan dengan DLL UCRT dan vcruntime. /clr
msvcmrtd.lib Pustaka statis untuk versi Debug dari startup CRT asli campuran dan terkelola untuk digunakan dengan DLL UCRT dan vcruntime. Tidak dapat didistribusikan ulang. /clr
msvcurt.lib Pustaka Statis yang tidak digunakan lagi untuk CRT terkelola murni. /clr:pure
msvcurtd.lib Pustaka Statis yang tidak digunakan lagi untuk versi Debug dari CRT terkelola murni. Tidak dapat didistribusikan ulang. /clr:pure

Jika Anda menautkan program Anda dari baris perintah tanpa opsi pengkompilasi yang menentukan pustaka runtime C, linker akan menggunakan pustaka CRT yang ditautkan secara statis: libcmt.lib, , libvcruntime.libdan libucrt.lib.

Menggunakan CRT yang ditautkan secara statis menyiratkan bahwa informasi status apa pun yang disimpan oleh pustaka runtime C akan menjadi lokal untuk instans CRT tersebut. Misalnya, jika Anda menggunakan strtok CRT yang ditautkan secara statis, posisi strtok pengurai tidak terkait dengan strtok status yang digunakan dalam kode dalam proses yang sama (tetapi dalam DLL atau EXE yang berbeda) yang ditautkan ke instans lain dari CRT statis. Sebaliknya, status berbagi CRT yang ditautkan secara dinamis untuk semua kode dalam proses yang secara dinamis ditautkan ke CRT. Kekhawatiran ini tidak berlaku jika Anda menggunakan versi baru yang lebih aman dari fungsi-fungsi ini; misalnya, strtok_s tidak memiliki masalah ini.

Karena DLL yang dibangun dengan menautkan ke CRT statis memiliki status CRT sendiri, kami tidak menyarankan Anda menautkan secara statis ke CRT dalam DLL kecuali konsekuensinya dipahami dan diinginkan. Misalnya, jika Anda memanggil _set_se_translator dalam executable yang memuat DLL yang ditautkan ke CRT statisnya sendiri, pengecualian perangkat keras apa pun yang dihasilkan oleh kode di DLL tidak akan ditangkap oleh penerjemah, tetapi pengecualian perangkat keras yang dihasilkan oleh kode di executable utama akan tertangkap.

Jika Anda menggunakan /clr sakelar kompilator, kode Anda akan ditautkan dengan pustaka statis, msvcmrt.lib. Pustaka statis menyediakan proksi antara kode terkelola Anda dan CRT asli. Anda tidak dapat menggunakan CRT ( /MT atau /MTd opsi) yang ditautkan secara statis dengan /clr. Gunakan pustaka yang ditautkan secara dinamis (/MD atau /MDd) sebagai gantinya. Pustaka CRT terkelola murni tidak digunakan lagi di Visual Studio 2015 dan tidak didukung di Visual Studio 2017.

Untuk informasi selengkapnya tentang menggunakan CRT dengan /clr, lihat Rakitan Campuran (Asli dan Terkelola).

Untuk membuat versi debug aplikasi Anda, _DEBUG bendera harus ditentukan dan aplikasi harus ditautkan dengan versi debug dari salah satu pustaka ini. Untuk informasi selengkapnya tentang menggunakan versi debug file pustaka, lihat teknik penelusuran kesalahan CRT.

Versi CRT ini tidak sepenuhnya sesuai dengan standar C99. Dalam versi sebelum Visual Studio 2019 versi 16.8, <tgmath.h> header tidak didukung. Di semua versi, CX_LIMITED_RANGE makro pragma dan FP_CONTRACT tidak didukung. Elemen tertentu seperti arti penentu parameter dalam fungsi IO standar menggunakan interpretasi warisan secara default. Anda dapat menggunakan /Zc opsi kesuaian kompilator dan menentukan opsi linker untuk mengontrol beberapa aspek kesuaian pustaka.

File pustaka standar (STL) .lib C++

Pustaka standar C++ Karakteristik Opsi Arahan pra-prosesor
libcpmt.lib Tautan statis multithreaded /MT _MT
msvcprt.lib Tautan dinamis multithreaded (impor pustaka untuk msvcp<version>.dll) /MD _MT, _DLL
libcpmtd.lib Tautan statis multithreaded /MTd _DEBUG, _MT
msvcprtd.lib Tautan dinamis multithreaded (impor pustaka untuk msvcp<version>d.dll) /MDd _DEBUG, _MT, _DLL

Saat Anda membuat versi rilis proyek Anda, salah satu pustaka runtime C dasar (libcmt.lib, , msvcmrt.lib, msvcrt.lib) ditautkan secara default, tergantung pada opsi kompilator yang Anda pilih (multithreaded, DLL, /clr). Jika Anda menyertakan salah satu file header pustaka standar C++ dalam kode Anda, pustaka standar C++ akan ditautkan secara otomatis oleh Visual C++ pada waktu kompilasi. Contohnya:

#include <ios>

Untuk kompatibilitas biner, lebih dari satu file DLL dapat ditentukan oleh satu pustaka impor. Pembaruan versi dapat memperkenalkan pustaka titik, DLL terpisah yang memperkenalkan fungsionalitas pustaka baru. Misalnya, Visual Studio 2017 versi 15.6 yang diperkenalkan msvcp140_1.dll untuk mendukung fungsionalitas pustaka yang lebih standar tanpa merusak Antarmuka Biner Aplikasi (ABI) yang didukung oleh msvcp140.dll. msvcprt.lib Pustaka impor yang disertakan dalam toolset untuk Visual Studio 2017 versi 15.6 mendukung DLL, dan vcredist untuk versi ini menginstal kedua DLL. Setelah dikirim, pustaka titik memiliki ABI tetap, dan tidak akan pernah memiliki dependensi pada pustaka titik selanjutnya.

Masalah apa yang ada jika aplikasi menggunakan lebih dari satu versi CRT?

Setiap gambar yang dapat dieksekusi (EXE atau DLL) dapat memiliki CRT yang ditautkan secara statis sendiri, atau dapat secara dinamis ditautkan ke CRT. Versi CRT yang secara statis disertakan dalam atau dimuat secara dinamis oleh gambar tertentu tergantung pada versi alat dan pustaka yang dibangunnya. Satu proses dapat memuat beberapa gambar EXE dan DLL, masing-masing dengan CRT-nya sendiri. Masing-masing CRT tersebut dapat menggunakan alokator yang berbeda, mungkin memiliki tata letak struktur internal yang berbeda, dan dapat menggunakan pengaturan penyimpanan yang berbeda. Ini berarti memori yang dialokasikan, sumber daya CRT, atau kelas yang diteruskan di seluruh batas DLL dapat menyebabkan masalah dalam manajemen memori, penggunaan statis internal, atau interpretasi tata letak. Misalnya, jika kelas dialokasikan dalam satu DLL tetapi diteruskan ke dan dihapus oleh yang lain, deallocator CRT mana yang digunakan? Kesalahan yang disebabkan dapat berkisar dari halang hingga segera fatal, dan oleh karena itu transfer langsung sumber daya tersebut tidak disarankan.

Anda dapat menghindari banyak masalah ini dengan menggunakan teknologi Application Binary Interface (ABI), karena dirancang agar stabil dan dapat diversifikasi. Rancang antarmuka ekspor DLL Anda untuk meneruskan informasi berdasarkan nilai, atau untuk mengerjakan memori yang diteruskan oleh pemanggil daripada dialokasikan secara lokal dan dikembalikan ke pemanggil. Gunakan teknik marshaling untuk menyalin data terstruktur di antara gambar yang dapat dieksekusi. Merangkum sumber daya secara lokal dan hanya memungkinkan manipulasi melalui handel atau fungsi yang Anda ekspos ke klien.

Anda juga dapat menghindari beberapa masalah ini jika semua gambar dalam proses Anda menggunakan versi CRT yang dimuat secara dinamis yang sama. Untuk memastikan bahwa semua komponen menggunakan versi DLL CRT yang sama, buat dengan menggunakan /MD opsi , dan gunakan set alat pengkompilasi dan pengaturan properti yang sama.

Berhati-hatilah jika program Anda melewati sumber daya CRT tertentu di seluruh batas DLL. Sumber daya seperti handel file, lokal, dan variabel lingkungan dapat menyebabkan masalah, bahkan saat menggunakan versi CRT yang sama. Untuk informasi selengkapnya tentang masalah yang terlibat dan cara mengatasinya, lihat Potensi kesalahan melewati objek CRT di seluruh batas DLL.

Baca juga

Referensi pustaka runtime C
Mendistribusikan ulang File Visual C++