有關 C 運行庫以及使用 /clr(公共語言運行時編譯) 進行編譯時要使用哪些庫的更多信息,請參見 CRT 庫功能。
傳遞給鏈接器的給定調用的所有模塊都必須使用相同的運行庫編譯器選項(/MD、/MT、/LD)進行編譯。
有關如何使用運行庫的調試版本的更多信息,請參見C 運行時庫參考。
知識庫文章 Q140584 也討論如何選擇適當的 C 運行庫。
有關 DLL 的更多信息,請參見 Visual C++ 中的 DLL。
在 Visual Studio 開發環境中設置此編譯器選項
打開項目的“屬性頁”對話框。 有關詳細信息,請參見如何:打開項目屬性頁。
展開“C/C++”文件夾。
選擇“代碼生成”屬性頁。
修改“運行庫”屬性。
以編程方式設置此編譯器選項
請參見RuntimeLibrary。
若要了解有關 Visual Studio 2017 RC 的最新文檔,請參閱 Visual Studio 2017 RC 文檔。
動態鏈接庫 (DLL) 是作為函數和資源的共享庫的可執行文件。 動態鏈接可使執行文件調用函數或使用存儲在單獨文件中的資源。
可從使用這些函數和資源的可執行文件中對其分別進行編譯和部署。 操作系統可在已加載可執行文件時或在運行時按需將 DLL 加載到可執行的內存空間中。
DLL 還可以在可執行文件之間輕松共享函數和資源。 多個應用程序可同時訪問內存中單個 DLL 副本的內容。
靜態鏈接會將 .lib 文件中所有對象代碼復制到可執行文件中。 動態鏈接僅包括在運行時用於查找和加載含有數據項或函數的 DLL 所需的信息。
在創建 DLL 時,還會創建一個包含此信息的 .lib 文件。 生成調用 DLL 的可執行文件時,鏈接器會使用 .lib 文件中的導出符號來為加載程序存儲此信息。
當加載程序加載 DLL 時,該 DLL 會映射到你的可執行文件的內存空間中。 將調用 DLL 中的特殊函數 DllMain 來執行 DLL 要求的任何初始化。
使用動態鏈接代替靜態鏈接有若干優點。 當使用 DLL 時,可以節省內存空間,並減少交換操作。 當多個應用程序可以使用 DLL 的單個副本時,可以節省磁盤空間和下載帶寬。
DLL 可單獨部署和更新,這可以使你在無需重新生成和發布所有代碼的情況下,提供售后支持和軟件更新。 DLL 是一種提供特定區域資源的簡便方法,可以支持多語言程序,並簡化創建國際版本應用程序的過程。
下列主題提供有關如何編程 DLL 的詳細信息。
本節內容
演練:創建和使用動態鏈接庫 (C++)
介紹如何使用 Visual Studio 創建和使用 DLL。
應用程序和 DLL 之間的區別
描述應用程序和 DLL 之間的基本區別。
使用 DLL 的優點
描述動態鏈接的優點。
DLL 的類型
提供有關可生成的不同類型的 DLL 的信息。
DLL 常見問題
提供有關 DLL 的常見問題解答。
將可執行文件鏈接到 DLL
描述與 DLL 的顯式鏈接和隱式鏈接。
初始化 DLL
討論當 DLL 加載時必須執行的 DLL 初始化代碼(如分配內存)。
運行庫行為
描述運行庫如何執行 DLL 啟動序列。
LoadLibrary 和 AfxLoadLibrary
討論如何在運行時使用 LoadLibrary 和 AfxLoadLibrary 顯式鏈接到 DLL。
GetProcAddress
討論如何使用 GetProcAddress 獲取 DLL 中導出函數的地址。
FreeLibrary 和 AfxFreeLibrary
討論當不再需要 DLL 模塊時如何使用 FreeLibrary 和 AfxFreeLibrary。
Windows 用來定位 DLL 的搜索路徑
描述 Windows 操作系統用來定位系統上的 DLL 的搜索路徑。
動態鏈接到 MFC 的規則 DLL 的模塊狀態
描述動態鏈接到 MFC 的規則 DLL 的模塊狀態。
擴展 DLL
解釋通常實現從現有 Microsoft 基礎類庫類派生的可重用類的 DLL。
創建純資源 DLL
討論只包含資源(如圖標、位圖、字符串和對話框等)的純資源 DLL。
MFC 應用程序中已本地化的資源:附屬 DLL
提供對附屬 DLL 的增強支持,該功能有助於創建針對多種語言進行本地化的應用程序。
導入和導出
描述如何將公共符號導入應用程序或從 DLL 導出函數。
Active 技術和 DLL
使對象服務器得以在 DLL 內實現。
DLL 中的自動化
描述“MFC DLL 向導”中的“自動化”選項提供的內容。
MFC DLL 命名約定
討論 MFC 中包含的 DLL 和庫如何遵循結構化命名約定。
從 Visual Basic 應用程序調用 DLL 函數
描述如何從 Visual Basic 應用程序中調用 DLL 函數。
相關章節
將 MFC 作為 DLL 的一部分使用
描述使你可以將 MFC 庫作為 Windows 動態鏈接庫的一部分來使用的規則 DLL。
MFC 的 DLL 版本
描述如何將 MFCxx.dll 和 MFCxxD.dll(其中 x 是 MFC 版本號)共享動態鏈接庫用於 MFC 應用程序和擴展 DLL。
(NOTINBUILD)Visual C++ Programming Methodologies
提供描述有關 Visual C++ 庫的概念信息和討論各種編碼技術和方法的主題的鏈接。
項目生成動態庫
項目生成靜態庫
修改 目標計算機屬性 x86 x64 ARM etc...
修改默認指令集
error LNK2038: 檢測到“RuntimeLibrary”的不匹配項: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug
屬性1. 在工程上右鍵->屬性->c/c++->代碼生成->運行庫
四個選項及含義分別如下:
1.1 /MDd:MD_DynamicDebug,我理解是 “共享DLL中使用MFC” 時的 Debug
1.2 /MD:MD_DynamicRelease,我理解是 “共享DLL中使用MFC” 時的 Release
1.3 /MT:MD_StaticRelease,我理解是 “在靜態庫中使用MFC” 時的 Debug
1.4 /MTd:MD_StaticDebug,我理解是 “在靜態庫中使用MFC” 時的 Release
屬性2. 在工程上右鍵->屬性->配置屬性-->常規-->MFC的使用
2.1 其中兩個選項如下:
2.2 在共享DLL中使用MFC
2.3 在靜態庫中使用MFC
屬性3. 我們有兩種編譯模式,一種是Release,一種是Debug。
問題來了:
VisualStudio報錯:error LNK2038: 檢測到“RuntimeLibrary”的不匹配項: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug
翻譯:這句的意思是 檢測到 “運行庫” 的不匹配項:值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug
人話:………………………… 屬性1……………………… 屬性1.4…………………………屬性1.1
解決:能夠看出來是Debug時的 屬性1 和 屬性2 不匹配,那要么將 屬性1設置為 /MDd,要么將 屬性2 設置為 在靜態庫中使用MFC。
反正編譯模式(屬性3)、MFC的使用(屬性2)、運行庫(屬性3)要三位一體對應起來。