C çalışma zamanı kitaplığı nedir?


158

Aslında bir C çalışma zamanı kütüphanesi nedir ve ne için kullanılır? Arama yapıyordum, şeytan gibi Googling yapıyordum, ancak Microsoft'unkinden daha iyi bir şey bulamadım: "Microsoft çalışma zamanı kitaplığı, Microsoft Windows işletim sistemi için programlama için rutinler sağlar. Bu rutinler, sağlanmayan birçok genel programlama görevini otomatik hale getirir C ve C ++ dilleri. "

Tamam, anladım, ama örneğin içinde ne var libcmt.lib? Bu ne işe yarıyor? C standart kütüphanesinin C derleyicisinin bir parçası olduğunu düşündüm. Peki libcmt.libWindows 'C standart kütüphane fonksiyonlarının uygulanması win32 altında çalışacak mı?

Yanıtlar:


71

Evet, libcmt, Microsoft'un derleyicisi ile sağlanan C standart kitaplığının (birkaçından biri) uygulamasıdır. Üç temel kitaplık türünün hem "hata ayıklama" hem de "yayınlama" sürümlerini sağlarlar: tek iş parçacıklı (her zaman statik olarak bağlı), çok iş parçacıklı statik olarak bağlanmış ve dinamik olarak bağlanmış çok iş parçacıklı (derleyici sürümüne bağlı olarak) Bunlardan bazıları mevcut olmayabilir).

Yani, "libcmt" adında, "libc" C kütüphanesinin geleneksel adıdır (az ya da çok). "Mt", "çok iş parçacıklı" anlamına gelir. Bir "hata ayıklama" sürümü sonuna "libcmtd" vererek "d" eklenir.

Hangi işlevleri içerdiği sürece, C standardı (eğer bakım yaparsanız bölüm 7), uygun (barındırılan) bir uygulamanın sağlaması gereken bir dizi işlevi tanımlar. Çoğu satıcı (Microsoft dahil) başka çeşitli işlevler de ekler (uyumluluk için, standart işlevlerin ele almadığı yetenekleri sağlamak vb.) Çoğu durumda, derleyici tarafından kullanılan birkaç "iç" işlev de içerir. ancak normalde son kullanıcı tarafından değil.

"Libcmt" içindeki işlevlerin tam bir listesini almak istiyorsanız (örneğinizi kullanmak için) Visual Studio komut istemlerinden birini açabilirsiniz (normalde "Visual Studio Tools" altında), kitaplıklarınızın bulunduğu dizine geçin yükledikten sonra şöyle bir şey yazın: bu kitaplıktaki tüm nesne dosyalarının adlarının lib -list libcmt.lib( uzun ) bir listesini oluşturur . Bunlar her zaman doğrudan işlevlerin adlarına karşılık gelmez , ancak genellikle bir fikir verir. Belirli bir nesne dosyasına bakmak isterseniz lib -extract, bu nesne dosyalarından birini ayıklamak için kullanabilirsiniz , daha sonra o nesne dosyasında dumpbin /symbols <object file name>hangi işlevlerin olduğunu bulmak için kullanabilirsiniz .


37
"C runtime library" nin ne olduğunu söylemediniz!
onmyway133

4
@entropy: Tabii ki bana yaptığım gibi görünüyor, ancak kısa cevap, birçoğu (ancak hepsi değil) C standardının 7. bölümünde belirtilen bir işlevler koleksiyonudur.
Jerry Coffin

3
Bu cevap C kütüphanelerinin derleyici araç zincirlerinin sadece bir parçası olduğunu ima eder. Kesin değil.
jiggunjer

@JerryCoffin Soru: Öyleyse strcpy, C standart kitaplığındaki işlev, örneğin çalışma zamanı kitaplığında uygulanmasını mı, yoksa normal .c dosyalarında kodunu mu kullanır?
forumcu

@forumulator: normalde standart kütüphaneyi (..dll, lib, .a, .so veya kullandığınız sisteme uygulamak için ne olursa olsun) üretmek için derlenen bir .c dosyasında kaynak kodu olacaktır. .
Jerry Coffin

57

İlk önce bir Çalışma Zamanı Kütüphanesi'nin ne olduğunu anlamalıyız; ve "Microsoft C Çalışma Zamanı Kitaplığı" ile ne anlama gelebileceğini düşünün.

bkz. http://en.wikipedia.org/wiki/Runtime_library

Güncellenebilir çünkü makalenin çoğunu burada yayınladım.

Bir bilgisayar programının kaynak kodu bir derleyici tarafından ilgili hedef dile çevrildiğinde, programdaki her komut ve yerleşik bir işleve yapılan her çağrı yerinde üretime neden olursa, program kodunun aşırı genişlemesine neden olur. her seferinde hedef dilde ilgili program kodunun tamamı. Bunun yerine derleyici, çalışma zamanı kitaplığında çoğunlukla uygulama programcılarına erişilemeyen derleyiciye özgü yardımcı işlevleri kullanır. Derleyici üreticisine bağlı olarak, çalışma zamanı kitaplığı bazen ilgili derleyicinin standart kitaplığını da içerecek veya içinde yer alacaktır.

Ayrıca çalışma zamanında yalnızca gerçekleştirilebilen (veya daha verimli veya doğru olan) bazı işlevler çalışma zamanı kitaplığında uygulanır, örneğin bazı mantık hataları, dizi sınırları denetimi, dinamik tür denetimi, özel durum işleme ve muhtemelen hata ayıklama işlevi. Bu nedenle, karmaşık derleme zamanı kontrolü ve yayın öncesi testlere rağmen, program gerçek verilerle "canlı" bir ortamda test edilene kadar bazı programlama hataları bulunmaz. Bu durumda, son kullanıcı bir çalışma zamanı hata iletisiyle karşılaşabilir.

Genellikle çalışma zamanı kitaplığı, işletim sistemine erişerek birçok işlevi gerçekleştirir. Birçok programlama dili, derleyicide gerçekleştirilmesi gerekmeyen, ancak çalışma zamanı kitaplığında uygulanabilen yerleşik işlevlere sahiptir. Dolayısıyla, çalışma zamanı kitaplığı ve standart kitaplık arasındaki sınır derleyici üreticisine bağlıdır. Bu nedenle, çalışma zamanı kitaplığı her zaman derleyiciye ve platforma özgüdür.

Çalışma zamanı kitaplığı kavramı, bir uygulama programcısı tarafından oluşturulan veya bir üçüncü taraf veya dinamik bir kitaplık tarafından oluşturulan, çalışma zamanında bağlantılı bir program kitaplığı gibi sıradan bir program kitaplığı ile karıştırılmamalıdır. Örneğin, programlama dili C yalnızca minimal bir çalışma zamanı kitaplığı gerektirir (genellikle crt0 olarak adlandırılır), ancak her uygulamanın sunması gereken büyük bir standart kitaplığı (C standart kitaplığı denir) tanımlar.


3
Standart kütüphaneden ayırmanın bir yolu olarak vurgulanan cümle, "çoğu" veya "bazen" ile nitelendirilmediğini gördüğüm ilk kısa doğru cevaptır.
nik.shornikov

@ nik.shornikov: Diğer açıklamalar daha doğru olmaya çalıştığı için. Standart bir kütüphanenin genellikle bir derleyici ve platforma özgü olduğu doğru olsa da , bu her zaman doğru değildir. Örneğin, Mingw ve Intel'in Windows için C ++ derleyicisinin en azından bazı sürümleri, kendi standartlarını sağlamak yerine Microsoft'un standart kitaplığını kullanmıştır. Aynı şekilde, Linux üzerindeki Clang, standart kütüphaneyi kendisi için başkasını kurmak yerine mevcut bir gcc kurulumunda kullanmak için kurulabilir (ve sıklıkla yüklenebilir).
Jerry Coffin

POSIX'i destekleyen herhangi bir platforma taşınabilir olan hem C hem de C ++ standart kitaplıklarının uygulamalarının yazılmasının mümkün olduğundan eminim.
Jerry Coffin

21

Sadece kendime sordum ve birkaç saat boyunca beynime zarar veriyordum. Hala gerçekten önemli bir şey bulamadı. Bir konuya bir şeyler yazan herkes aslında "öğretemez". Birisine öğretmek istiyorsanız, bir kişinin anladığı en temel dili kullanın, bu yüzden bir konuyu ele alırken diğer konuları önemsemesine gerek yoktur. Bu yüzden kendim için tüm bu kaosa uygun görünen bir sonuca vardım.

C programlama dilinde, her program main()fonksiyonla başlar . Diğer diller, programın başladığı diğer işlevleri tanımlayabilir. Ama bir işlemci bilmiyor main(). Bir işlemci kombinasyonları ile temsil edilen sadece önceden tanımlanmış komutları bilir 0ve 1.

Temel işlemci işletim sistemi olmayan (Microsoft Windows, Linux, MacOS, ..) mikroişlemci programlamasında, ProgramCounter(PC) 'yi tekrarlayan ve atlayan (döngüler, işlev çağrıları) ayarlayarak işlemciye nereden başlayacağını açıkça söylemeniz gerekir . işlemci tarafından bilinen komutlar. RAM'in ne kadar büyük olduğunu bilmeniz gerekir, program yığınının konumunu (yerel değişkenler), yığının konumunu (dinamik değişkenler) ve global değişkenlerin konumunu (sanırım SSA olarak adlandırılmış) ayarlamanız gerekir. ?) RAM içinde. Tek bir işlemci aynı anda yalnızca bir program yürütebilir.

İşte işletim sistemi devreye giriyor. İşletim sisteminin kendisi işlemcide çalışan bir program. Özel kod yürütülmesine izin veren bir program. Programların yürütme kodları (RAM'e yüklenen) arasında geçiş yaparak aynı anda birden fazla program çalıştırır. Ancak işletim sistemi BİR PROGRAMDIR, her program farklı yazılmıştır. Özel programınızın kodunu RAM'e yerleştirmek çalışmaz, işletim sistemi bunu bilmez. Programınızı kaydeden işletim sistemindeki işlevleri çağırmanız, işletim sistemine programın ne kadar belleğe ihtiyaç duyduğunu, programa giriş noktasının bulunduğu yeri (main()fonksiyonu C). Sanırım bu, Çalışma Zamanı Kitaplığı'nda bulunur ve neden her işletim sistemi için özel bir kitaplığa ihtiyacınız olduğunu açıklar, çünkü bunlar sadece programların kendisidir ve bunları yapmak için farklı işlevlere sahiptir.

Bu aynı zamanda .dllRUNTIME Kitaplığı olarak adlandırılsa bile çalışma zamanında dosyalar neden dinamik olarak BAĞLANMADIĞINI açıklar . Çalışma zamanı kitaplığının statik olarak bağlanması gerekir, çünkü programın başlangıcında gereklidir. Çalışma Zamanı Kitaplığı, RUNTIME içinde özel programınızı başka bir programa (işletim sistemine) ekler / bağlar. Bu gerçekten bazı beyin f neden olur ...

Sonuç: RUNTIME Kütüphane adlandırmada başarısızdır. Bir olmuştur olmayabilir .dllerken zamanlarda (zamanında bağlama) ve farkı anlamak konusunun sadece mevcut değildi. Ama bu doğru olsa bile, isim kötü seçilmiş.

Çalışma Zamanı Kitaplığı için daha iyi adlar şunlar olabilir: StartupLibrary / OSEntryLibrary / SystemConnectLibrary / OSConnectLibrary

Umarım düzeltme / genişleme için doğru anladım. şerefe.


1
Hala ideia alamıyorum. Bir programın Çalışma Zamanı'nda neden bir şeye ihtiyacı var? Neden ikili kod çalışma zamanında destekleyen hiçbir şey olmadan,% 100 tek başına çalışamaz? Veya başka bir deyişle:% 100 hiçbir şey (OS dahil) çalıştıran bir kod olması mümkün müdür?
MarcioAB

5
Teorik olarak bir programın RTL'ye ihtiyacı yoktur . Ancak, programınız herhangi bir sonucu görüntüleyemez veya işletim sisteminden herhangi bir işbirliği yapmadan herhangi bir girdi veya bellek alabilir mi?
SN

16

C bir dildir ve tanımında, kullanabileceğiniz herhangi bir işlev olması gerekmez. IO yok, matematik rutini yok vb. Kural olarak, çalıştırılabilir programınıza bağlayabileceğiniz bir dizi rutin vardır, ancak bunları kullanmanıza gerek yoktur . Ancak bu, çoğu bağlayıcının artık C çalışma zamanı kitaplıklarına bağlanmanızı istemediği yaygın bir şeydir.

Bunları istemediğiniz zamanlar vardır - örneğin, gömülü sistemlerle çalışırken, örneğin malloc olması pratik olmayabilir. PostScript'i yazıcılara gömmek için çalışıyordum ve gömülü sistemlerde çok daha mutlu olan kendi çalışma zamanı kitaplıkları setimiz vardı, bu yüzden "standart" ile uğraşmadık.


11
Aslında, C standartları iki tür C ortamı tanımlar - "bağımsız" ve "barındırılan" - ve barındırılan ortamlarda, standartlarda açıklanan işlevler kullanılabilir olarak tanımlanır. Gömülü sistemlerde, C ortamı genellikle bağımsızdır, böylece kütüphane rutinlerine sahip olmayabilir veya bazılarını kullanmaktan kaçınabilir ve kendi değiştirmelerinizi kullanabilirsiniz.

10

Çalışma zamanı kitaplığı, çalıştırdığınız herhangi bir C programı için otomatik olarak derlenen kitaplıktır. Kullanacağınız kütüphanenin sürümü derleyicinize, platformunuza, hata ayıklama seçeneklerine ve çoklu kullanım seçeneklerine bağlıdır.

Çalışma zamanı kitaplıkları için farklı seçeneklerin iyi bir açıklaması: http://www.davidlenihan.com/2008/01/choosing_the_correct_cc_runtim.html

Normalde aramak için bir kütüphaneye ihtiyaç duymadığınızı düşündüğünüz işlevleri içerir:

  • malloc
  • numaralandırma
  • abs, dk
  • assert

Microsoft, çalışma zamanı kitaplığı işlevlerinin güzel bir listesine sahiptir:

http://msdn.microsoft.com/en-us/library/2aza74he(VS.71).aspx

İşlevlerin tam listesi derleyiciye bağlı olarak değişebilir, bu nedenle iOS için dispatch_async () veya NSLog () gibi diğer işlevleri alırsınız.


1
Struct ve enum gerçekten bir çalışma zamanı kütüphanesi midir?
Dean P

6

C veya C ++ derlenmiş bir yürütülebilir dosyada Dependency Walker gibi bir araç kullanırsanız , bağımlı DLL'lerden birinin MSVCRT.DLL olduğunu göreceksiniz. Bu, Microsoft C Çalışma Zamanı Kitaplığı'dır. DW ile MSVCRT.DLL incelerseniz, bunun printf (), koyar (0, gets (), atoi () vb. Gibi tüm işlevlerin yaşandığını göreceksiniz.


6
Yalnızca bu yürütülebilir dosyayı derlerken C çalışma zamanı dinamik olarak bağlanmıştır. Statik olarak bağlanmışsa, bağımlılık yürüteç nothiing gösterecektir
Eli Bendersky

4

Microsoft'un tanımının gerçekten anlamı olduğunu düşünüyorum:

Standart C çalışma zamanı kitaplığının Microsoft uygulaması ...


3

Win32 SDK ile sağlanan C Çalışma Zamanı kitaplığının üç biçimi vardır:

* LIBC.LIB is a statically linked library for single-threaded programs.
* LIBCMT.LIB is a statically linked library that supports multithreaded programs.
* CRTDLL.LIB is an import library for CRTDLL.DLL that also supports multithreaded programs. CRTDLL.DLL itself is part of Windows NT. 

Microsoft Visual C ++ 32 bit sürümü de bu üç formu içerir, ancak bir DLL'deki CRT MSVCRT.LIB olarak adlandırılır. DLL yeniden dağıtılabilir. Adı VC ++ sürümüne (örn. MSVCRT10.DLL veya MSVCRT20.DLL) bağlıdır. Ancak, MSVCRT10.DLL Win32'lerde desteklenmezken, CRTDLL.LIB Win32'lerde desteklenir. MSVCRT20.DLL iki sürümde gelir: biri Windows NT ve diğeri Win32s için.

bkz. http://support.microsoft.com/?scid=kb%3Ben-us%3B94248&x=12&y=9

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.