1. 程式人生 > >什麼是c執行時庫?

什麼是c執行時庫?

nafxcw.lib 和 libcmt.lib衝突問題。
解決辦法:
屬性設定裡讓程式先找到nafxcw.lib.
解決辦法參考:https://www.cnblogs.com/suiyingjie/archive/2012/10/29/2745031.html

從vs2008 工程屬性中,從/MT換成/MD時,出現msvcrt.lib和libcmt.lib衝突警告。
解決辦法:
忽略掉libcmt.lib,編譯只要能找到lib就行,編譯是拷貝lib裡面連線符號到程式,所以能找到一份就行,衝突解決掉就可以。

問題點:
1,這倆庫分別是什麼?
nafxcw.lib 可能是靜態mfc庫。
libcmt.lib 是c執行時庫,多執行緒靜態庫。

2,c執行時庫是什麼?
C執行時庫就是 C run-time library,是 C 而非 C++ 語言世界的概念:取這個名字就是因為你的 C 程式執行時需要這些庫中的函式.
C run-time library裡面含有初始化程式碼,還有錯誤處理程式碼(例如divide by zero處理)。你寫的程式可以沒有math庫,程式照樣執行,只是不能處理複雜的數學運算,不過如果沒有了C run-time庫,main()就不會被呼叫,exit()也不能被響應。因為C run-time library包含了C程式執行的最基本和最常用的函式。
那有了c++後,出現了c++執行時庫,它包括了上面所說的 C run-time library 和 STL。包含 C run-time library 的原因很明顯,C++ 是 C 的超集,沒有理由再重新來一個 C++ run-time library. VC針對C++ 加入的Standard C++ Library主要包括:LIBCP.LIB, LIBCPMT.LIB和 MSVCPRT.LIB。

3,單執行緒和多執行緒執行庫,靜態執行庫和動態執行庫
4,編譯選項/ML /MD是什麼意思?
這倆編譯選項就是選擇靜態還是動態執行庫的。

編譯器連結選項:
VC帶的編譯器名字叫cl.exe,它有幾個與標準程式庫有關的選項:/ML、/MLd、/MT、/MTd、/MD、/MDd。編譯時到底哪個C執行時庫聯入程式取決於這些編譯選項,選項告訴編譯器應用程式想使用什麼版本的C標準程式庫:
/ML對應單執行緒靜態版的執行時庫(libc.lib);
/MT對應多執行緒靜態版執行時庫(libcmt.lib),此時編譯器會自動定義_MT巨集;
/MD對應多執行緒DLL版(匯入庫msvcrt.lib,DLL是msvcrt.dll),編譯器自動定義_MT和_DLL兩個巨集。
後面加d的選項都會讓編譯器自動多定義一個_DEBUG巨集,表示要使用對應標準庫的除錯版,因此:
/MLd對應除錯版單執行緒靜態標準庫(libcd.lib);
/MTd對應除錯版多執行緒靜態標準庫(libcmtd.lib);
/MDd對應除錯版多執行緒DLL標準庫(匯入庫msvcrtd.lib,DLL是msvcrtd.dll)。
參考部落格地址:

https://blog.csdn.net/farmwang/article/details/48677769

5,我自己程式中怎麼用?
自己要編譯庫,如果依賴別的庫,那兩個庫的編譯選項要一致。

以上問題全部理解了。這篇部落格介紹了什麼是c執行時庫,c++執行時庫,以及編譯器怎麼支援這些庫,在以後的開發中很有幫助:
https://blog.csdn.net/wqvbjhc/article/details/6612099