Có 4 phiên bản của thư viện liên kết CRT có trong vc \ lib:
- libcmt.lib: thư viện liên kết CRT tĩnh cho bản dựng phát hành (/ MT)
- libcmtd.lib: thư viện liên kết CRT tĩnh cho bản dựng gỡ lỗi (/ MTd)
- msvcrt.lib: nhập thư viện cho phiên bản DLL phát hành của CRT (/ MD)
- msvcrtd.lib: nhập thư viện cho phiên bản DLL gỡ lỗi của CRT (/ MDd)
Nhìn vào các tùy chọn liên kết, Project + Properties, Linker, Command Line. Lưu ý làm thế nào các thư viện không được đề cập ở đây. Trình liên kết tự động tìm ra công tắc / M nào được trình biên dịch sử dụng và .lib nên được liên kết thông qua chỉ thị nhận xét #pragma. Điều quan trọng là, bạn sẽ gặp lỗi liên kết khủng khiếp và khó chẩn đoán lỗi thời gian chạy nếu có sự không khớp giữa tùy chọn / M và .lib mà bạn liên kết.
Bạn sẽ thấy thông báo lỗi bạn đã trích dẫn khi trình liên kết được yêu cầu cả hai liên kết đến msvcrt.lib và libcmt.lib. Điều này sẽ xảy ra nếu bạn liên kết mã được biên dịch với / MT với mã được liên kết với / MD. Chỉ có thể có một phiên bản CRT.
/ NODEFAULTLIB yêu cầu người liên kết bỏ qua chỉ thị nhận xét #pragma được tạo từ mã được biên dịch / MT. Điều này có thể hoạt động, mặc dù một loạt các lỗi liên kết khác không phải là hiếm. Những thứ như errno , là một extern int trong phiên bản CRT tĩnh nhưng macro-ed thành một chức năng trong phiên bản DLL. Nhiều người khác thích điều đó.
Chà, khắc phục vấn đề này đúng cách, tìm tệp .obj hoặc .lib mà bạn đang liên kết được biên dịch với tùy chọn sai / M. Nếu bạn không có đầu mối thì bạn có thể tìm thấy nó bằng cách lấy các tệp .obj / .lib cho "/ MT"
Btw: các tệp thực thi Windows (như version.dll) có phiên bản CRT riêng để hoàn thành công việc của họ. Nó nằm trong c: \ windows \ system32, bạn không thể sử dụng nó một cách đáng tin cậy cho các chương trình của riêng bạn, các tiêu đề CRT của nó không có sẵn ở bất cứ đâu. DLL CRT được sử dụng bởi chương trình của bạn có một tên khác (như msvcrt90.dll).