首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

VS 專案鏈接錯誤 LNK2005:標準庫重複定義解決方案

     編輯:C++ 入門

錯誤現象

error LNK2005: "public: __thiscall std::basic_string::~basic_string(void)" 
already defined in msvcprtd.lib(MSVCP90D.dll)

大量標準庫符號(如 std::string 構造/析構)報「已在 msvcprtd.lib 中定義」。

根本原因

專案使用 靜態庫,但 VS 專案設置的運行時庫為 動態鏈接(/MDd 或 /MD)。導致:

  • 靜態庫內部編譯時鏈接了靜態運行時(/MTd//MT),將標準庫符號編入 .lib
  • 主專案編譯時用動態運行時,期望從 DLL 導入標準庫符號
  • 鏈接時發現同一符號既在 .lib 又在 DLL 導入庫中 → 重複定義

解決方法

統一運行時庫類型:

  1. 打開專案屬性:Configuration Properties → C/C++ → Code Generation → Runtime Library
  2. 將 Multi-threaded Debug DLL (/MDd) 改為 Multi-threaded Debug (/MTd)(Release 同理 /MD → /MT)
  3. 重新編譯鏈接。

原理說明

選項運行時庫類型適用場景
/MTd靜態調試版靜態鏈接、單一 EXE、無 DLL 邊界
/MDd動態調試版動態鏈接、多 DLL 共享 CRT、插件架構

原則:整個解決方案(所有專案、靜態庫、動態庫)必須使用相同的運行時庫選項。混用會導致 LNK2005、堆損壞、雙重釋放等嚴重問題。

常見坑點

  • 引用第三方靜態庫時,不知其編譯選項,導致不匹配。
  • Debug/Release 混用(如主專案 Debug /MTd,引用庫 Release /MT)。
  • 使用 /NODEFAULTLIB 強制忽略默認庫屏蔽錯誤,實則埋下運行時隱患。

總結

LNK2005 標準庫重複定義 99% 是運行時庫選項不一致。統一全解決方案為 /MTd (靜態) 或 /MDd (動態) 即可徹底解決。建議團隊規範統一選項,避免此類低級鏈接錯誤。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved