Thư viện thời gian chạy C là gì?


157

Cái gì thực sự là một thư viện thời gian chạy C và nó được sử dụng để làm gì? Tôi đã tìm kiếm, Googling như một con quỷ, nhưng tôi không thể tìm thấy điều gì tốt hơn Microsoft: "Thư viện thời gian chạy của Microsoft cung cấp các thói quen lập trình cho hệ điều hành Microsoft Windows. Những thói quen này tự động hóa nhiều tác vụ lập trình phổ biến không được cung cấp bởi ngôn ngữ C và C ++. "

OK, tôi hiểu điều đó, nhưng ví dụ, cái gì ở trong libcmt.lib? Nó làm gì? Tôi nghĩ rằng thư viện chuẩn C là một phần của trình biên dịch C. Vì vậy, libcmt.libviệc triển khai các chức năng thư viện chuẩn C của Windows có hoạt động theo win32 không?

Câu trả lời:


71

Có, libcmt là (một trong một số) triển khai thư viện chuẩn C được cung cấp cùng với trình biên dịch của Microsoft. Họ cung cấp cả "debug" và "giải phóng" các phiên bản của ba loại cơ bản của thư viện: đơn luồng (luôn luôn liên kết tĩnh), đa luồng liên kết tĩnh , và đa luồng liên kết động (tuy nhiên, tùy thuộc vào phiên bản trình biên dịch bạn sử dụng, một số trong số đó có thể không có mặt).

Vì vậy, trong tên "libcmt", "libc" là tên truyền thống (ít nhiều) cho thư viện C. "Mt" có nghĩa là "đa luồng". Một phiên bản "gỡ lỗi" sẽ có "d" được thêm vào cuối, cho "libcmtd".

Theo như những gì nó bao gồm các chức năng, tiêu chuẩn C (phần 7, nếu bạn tình cờ quan tâm) xác định một tập hợp các chức năng mà việc triển khai (lưu trữ) tuân thủ phải cung cấp. Hầu hết các nhà cung cấp (bao gồm Microsoft) tự thêm các chức năng khác (để tương thích, để cung cấp khả năng cho các chức năng tiêu chuẩn không giải quyết, v.v.) Trong hầu hết các trường hợp, nó cũng sẽ chứa khá nhiều chức năng "nội bộ" được trình biên dịch sử dụng nhưng không bình thường bởi người dùng cuối.

Nếu bạn muốn có một danh sách đầy đủ các chức năng trong "libcmt" (để sử dụng ví dụ của bạn), bạn có thể mở một trong các lời nhắc lệnh của Visual Studio (trong "Công cụ Visual Studio", thông thường), chuyển sang thư mục chứa thư viện của bạn đã cài đặt và nhập một cái gì đó như: lib -list libcmt.libvà nó sẽ tạo ra một danh sách ( dài ) tên của tất cả các tệp đối tượng trong thư viện đó. Những người không luôn luôn tương ứng trực tiếp với tên của các chức năng, nhưng thường sẽ đưa ra một ý tưởng. Nếu bạn muốn xem xét một tệp đối tượng cụ thể, bạn có thể sử dụng lib -extractđể trích xuất một trong các tệp đối tượng đó, sau đó sử dụng dumpbin /symbols <object file name>để tìm (các) chức năng nào / nằm trong tệp đối tượng cụ thể đó.


37
Bạn chưa nói "Thư viện thời gian chạy C" là gì !!
onmyway133

4
@entropy: Chắc chắn tôi trông giống như tôi đã làm, nhưng câu trả lời ngắn gọn là đó là một tập hợp các hàm, nhiều (nhưng không nhất thiết là tất cả) được chỉ định trong phần 7 của tiêu chuẩn C.
Jerry Coffin

3
Câu trả lời này ngụ ý các thư viện C chỉ là một phần của các công cụ biên dịch. Không chính xác.
jiggunjer

@JerryCoffin Câu hỏi: strcpychẳng hạn, chức năng từ thư viện chuẩn C, chẳng hạn, có triển khai trong thư viện thời gian chạy không, hay nó chỉ có mã trong các tệp .c bình thường?
đàn

@forumulator: thông thường sẽ có mã nguồn trong tệp .c được biên dịch để tạo thư viện chuẩn phù hợp (..dll, lib, .a, .so hoặc bất cứ điều gì xảy ra để áp dụng cho hệ thống bạn đang sử dụng) .
Jerry Coffin

55

Đầu tiên, chúng ta nên hiểu Thư viện thời gian là gì; và nghĩ những gì nó có thể có nghĩa là "Thư viện Microsoft C Runtime".

xem: http://en.wikipedia.org/wiki/R nb_l Library

Tôi đã đăng hầu hết các bài viết ở đây vì nó có thể được cập nhật.

Khi trình biên dịch mã nguồn của chương trình máy tính được dịch sang ngôn ngữ đích tương ứng, nó sẽ gây ra sự mở rộng cực độ của mã chương trình nếu mỗi lệnh trong chương trình và mọi lệnh gọi đến hàm tích hợp sẽ gây ra việc tạo tại chỗ của mã chương trình tương ứng hoàn chỉnh trong ngôn ngữ đích mỗi lần. Thay vào đó, trình biên dịch thường sử dụng các hàm phụ trợ dành cho trình biên dịch trong thư viện thời gian chạy mà hầu hết các lập trình viên ứng dụng không thể truy cập được. Tùy thuộc vào nhà sản xuất trình biên dịch, thư viện thời gian chạy đôi khi cũng sẽ chứa thư viện chuẩn của trình biên dịch tương ứng hoặc được chứa trong nó.

Ngoài ra, một số chức năng chỉ có thể được thực hiện (hoặc hiệu quả hơn hoặc chính xác hơn) trong thời gian chạy được triển khai trong thư viện thời gian chạy, ví dụ: một số lỗi logic, kiểm tra giới hạn mảng, kiểm tra kiểu động, xử lý ngoại lệ và có thể là chức năng gỡ lỗi. Vì lý do này, một số lỗi lập trình không được phát hiện cho đến khi chương trình được kiểm tra trong môi trường "sống" với dữ liệu thực, mặc dù kiểm tra thời gian biên dịch phức tạp và kiểm tra trước khi phát hành. Trong trường hợp này, người dùng cuối có thể gặp thông báo lỗi thời gian chạy.

Thông thường thư viện thời gian thực hiện nhiều chức năng bằng cách truy cập hệ điều hành. Nhiều ngôn ngữ lập trình có các hàm dựng sẵn không nhất thiết phải được nhận ra trong trình biên dịch, nhưng có thể được thực hiện trong thư viện thời gian chạy. Vì vậy, biên giới giữa thư viện thời gian chạy và thư viện tiêu chuẩn phụ thuộc vào nhà sản xuất trình biên dịch. Do đó, một thư viện thời gian chạy luôn là trình biên dịch cụ thể và nền tảng cụ thể.

Không nên nhầm lẫn khái niệm thư viện thời gian chạy với thư viện chương trình thông thường như thư viện được tạo bởi một lập trình viên ứng dụng hoặc được cung cấp bởi bên thứ ba hoặc thư viện động, nghĩa là thư viện chương trình được liên kết trong thời gian chạy. Ví dụ, ngôn ngữ lập trình C chỉ yêu cầu một thư viện thời gian chạy tối thiểu (thường được gọi là crt0) nhưng xác định một thư viện tiêu chuẩn lớn (được gọi là thư viện chuẩn C) mà mỗi triển khai phải cung cấp.


3
Câu được tô sáng như một cách phân biệt với thư viện chuẩn là câu trả lời chính xác ngắn gọn đầu tiên tôi thấy không đủ điều kiện với "nhất" hoặc "đôi khi".
nik.shornikov

@ nik.shornikov: Đó là vì các mô tả khác cố gắng chính xác hơn. Mặc dù sự thật là một thư viện tiêu chuẩn thường dành riêng cho trình biên dịch và nền tảng, nhưng điều đó không phải lúc nào cũng đúng. Ví dụ, ít nhất một số phiên bản của cả trình biên dịch C ++ của Mingw và Intel cho Windows đã sử dụng thư viện chuẩn của Microsoft thay vì cung cấp riêng cho họ. Tương tự, Clang trên Linux có thể được cài đặt (và thường là) để sử dụng thư viện chuẩn trong bản cài đặt gcc hiện có thay vì cài đặt một cái khác cho chính nó.
Jerry Coffin

Tôi khá chắc chắn rằng có thể viết các triển khai của cả thư viện chuẩn C và C ++ có thể di chuyển tới bất kỳ nền tảng nào hỗ trợ POSIX.
Jerry Coffin

20

Tôi chỉ tự hỏi điều này và đã làm tổn thương não trong vài giờ. Vẫn không tìm thấy bất cứ điều gì thực sự làm cho một điểm. Mọi người viết một cái gì đó cho một chủ đề không thể thực sự "dạy". Nếu bạn muốn dạy ai đó, hãy sử dụng ngôn ngữ cơ bản nhất mà một người hiểu, vì vậy anh ta không cần quan tâm đến các chủ đề khác khi xử lý một chủ đề. Vì vậy, tôi đã đi đến một kết luận cho bản thân mình dường như rất phù hợp với tất cả sự hỗn loạn này.

Trong ngôn ngữ lập trình C, mọi chương trình đều bắt đầu bằng hàm main (). Các ngôn ngữ khác có thể định nghĩa các chức năng khác nơi chương trình bắt đầu. Nhưng một bộ xử lý không biết main (). Một bộ xử lý chỉ biết các lệnh được xác định trước, được biểu thị bằng các kết hợp "0" và "1".

Trong lập trình vi xử lý, không có hệ điều hành cơ bản (Microsoft Windows, Linux, MacOS, ..), bạn cần nói rõ cho bộ xử lý biết bắt đầu từ đâu bằng cách đặt Chương trình chương trình (PC) lặp lại và nhảy (vòng lặp, gọi hàm) các lệnh được biết đến với bộ xử lý. Bạn cần biết RAM lớn như thế nào, bạn cần đặt vị trí của ngăn xếp chương trình (biến cục bộ), cũng như vị trí của heap (biến động) và vị trí của biến toàn cục (tôi đoán nó được gọi là SSA ?) trong RAM. Một bộ xử lý chỉ có thể thực hiện một chương trình tại một thời điểm.

Đó là nơi hệ điều hành xuất hiện. Bản thân hệ điều hành là một chương trình chạy trên bộ xử lý. Một chương trình cho phép thực thi mã tùy chỉnh. Chạy nhiều chương trình cùng một lúc bằng cách chuyển đổi giữa các mã thực thi của các chương trình (được nạp vào RAM). Nhưng hệ điều hành LÀ MỘT CHƯƠNG TRÌNH, mỗi chương trình được viết khác nhau. Chỉ cần đặt mã chương trình tùy chỉnh của bạn vào RAM sẽ không chạy được, hệ điều hành không biết điều đó. Bạn cần gọi các chức năng trên hệ điều hành đăng ký chương trình của bạn, cho hệ điều hành biết chương trình cần bao nhiêu bộ nhớ, nơi đặt điểm vào chương trình (hàm main () trong trường hợp C). Và đây là những gì tôi đoán nằm trong RuntimeL Library và giải thích lý do tại sao bạn cần một thư viện đặc biệt cho mỗi hệ điều hành,

Điều này cũng giải thích lý do tại sao nó KHÔNG được liên kết động trong thời gian chạy như các tệp dll, ngay cả khi nó được gọi là RUNTIMEL Library. RuntimeL Library cần được liên kết tĩnh, vì nó cần thiết khi khởi động chương trình của bạn. RuntimeL Library đã đưa / kết nối chương trình tùy chỉnh của bạn vào / với một chương trình khác (hệ điều hành) tại RUNTIME. Điều này thực sự gây ra một số não ...

Kết luận: RUNTIMEL Library là một thất bại trong việc đặt tên. Có thể đã không có lúc nào (liên kết lúc chạy) và vấn đề hiểu sự khác biệt đơn giản là không tồn tại. Nhưng ngay cả khi điều này là đúng, tên này vẫn được chọn rất tệ.

Tên tốt hơn cho RuntimeL Library có thể là: StartupL Library / OSEntryL Library / SystemConnectL Library / OSConnectL Library

hy vọng tôi hiểu đúng, lên tiếng để chỉnh sửa / mở rộng cổ vũ.


1
Tôi vẫn không nhận được ideia. Tại sao một chương trình cần một cái gì đó tại Runtime? Tại sao mã nhị phân không thể chạy, một mình 100% mà không có gì hỗ trợ nó khi chạy? Hay nói cách khác: Có thể có một mã chạy 100% mà không cần bất cứ điều gì (bao gồm cả hệ điều hành)?
MarcioAB

5
Về lý thuyết, một chương trình không cần RTL. Tuy nhiên, làm thế nào chương trình của bạn sẽ hiển thị kết quả của nó hoặc lấy bất kỳ bộ nhớ đầu vào hoặc yêu cầu nào mà không có sự hợp tác từ hệ điều hành?
SN

16

C là một ngôn ngữ và theo định nghĩa của nó, không cần có bất kỳ chức năng nào có sẵn cho bạn. Không có IO, không có thói quen toán học và vân vân. Theo quy ước, có một tập hợp các thói quen có sẵn cho bạn mà bạn có thể liên kết với tệp thực thi của mình, nhưng bạn không cần phải sử dụng chúng. Tuy nhiên, đây là một điều phổ biến để làm mà hầu hết các trình liên kết không yêu cầu bạn liên kết với các thư viện thời gian chạy C nữa.

Có những lúc bạn không muốn chúng - ví dụ, khi làm việc với các hệ thống nhúng, chẳng hạn như có malloc chẳng hạn. Tôi đã từng làm việc để nhúng PostScript vào máy in và chúng tôi có bộ thư viện thời gian chạy riêng của chúng tôi hạnh phúc hơn nhiều trên các hệ thống nhúng, vì vậy chúng tôi không bận tâm đến "tiêu chuẩn".


11
Trên thực tế, các tiêu chuẩn C mô tả hai loại môi trường C - "tự do" và "được lưu trữ" - và, trong các môi trường được lưu trữ, các chức năng được mô tả trong các tiêu chuẩn được xác định là có sẵn. Trong các hệ thống nhúng, môi trường C thường là tự do, do đó bạn có thể không có thói quen thư viện hoặc bạn có thể tránh sử dụng một số và sử dụng thay thế của riêng bạn.

10

Thư viện thời gian chạy là thư viện được biên dịch tự động cho bất kỳ chương trình C nào bạn chạy. Phiên bản của thư viện bạn sẽ sử dụng tùy thuộc vào trình biên dịch, nền tảng, tùy chọn gỡ lỗi và tùy chọn đa luồng của bạn.

Một mô tả hay về các lựa chọn khác nhau cho các thư viện thời gian chạy: http://www.davidlenihan.com/2008/01/ch Mất_the_c chính_cc_runtim.html

Nó bao gồm những chức năng mà bạn thường không nghĩ là cần thư viện để gọi:

  • trung tâm thương mại
  • enum, cấu trúc
  • cơ bụng
  • khẳng định

Microsoft có một danh sách tốt các chức năng thư viện thời gian chạy của họ:

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

Danh sách chính xác các hàm sẽ thay đổi tùy thuộc vào trình biên dịch, vì vậy, đối với iOS, bạn sẽ nhận được các hàm khác như Clark_async () hoặc NSLog ().


1
Là struct và enum thực sự là một thư viện thời gian chạy?
Trưởng khoa P

6

Nếu bạn sử dụng một công cụ như Dependency Walker trên một tệp thực thi được biên dịch từ C hoặc C ++, bạn sẽ thấy một trong các DLL mà nó phụ thuộc vào là MSVCRT.DLL. Đây là Thư viện Microsoft C Runtime. Nếu bạn tiếp tục kiểm tra MSVCRT.DLL với DW, bạn sẽ thấy đây là nơi tất cả các hàm như printf (), đặt (0, got (), atoi (), v.v.


6
Chỉ khi trong khi biên dịch tệp thực thi đó, thời gian chạy C được liên kết động. Nếu nó được liên kết tĩnh, máy đi bộ phụ thuộc sẽ hiển thị thông báo
Eli Bendersky

4

Tôi nghĩ định nghĩa của Microsoft thực sự có nghĩa là:

Việc Microsoft triển khai thư viện thời gian chạy C tiêu chuẩn cung cấp ...


3

Có ba dạng thư viện C Run-time được cung cấp cùng với Win32 SDK:

* 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 ++ Phiên bản 32 bit cũng chứa ba biểu mẫu này, tuy nhiên, CRT trong một DLL có tên là MSVCRT.LIB. DLL là phân phối lại. Tên của nó phụ thuộc vào phiên bản của VC ++ (tức là MSVCRT10.DLL hoặc MSVCRT20.DLL). Tuy nhiên, xin lưu ý rằng MSVCRT10.DLL không được hỗ trợ trên Win32, trong khi CRTDLL.LIB được hỗ trợ trên Win32. MSVCRT20.DLL có hai phiên bản: một cho Windows NT và một cho Win32s.

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.