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統一運行時庫類型:
/MD → /MT)| 選項 | 運行時庫類型 | 適用場景 |
|---|---|---|
/MTd | 靜態調試版 | 靜態鏈接、單一 EXE、無 DLL 邊界 |
/MDd | 動態調試版 | 動態鏈接、多 DLL 共享 CRT、插件架構 |
原則:整個解決方案(所有專案、靜態庫、動態庫)必須使用相同的運行時庫選項。混用會導致 LNK2005、堆損壞、雙重釋放等嚴重問題。
/NODEFAULTLIB 強制忽略默認庫屏蔽錯誤,實則埋下運行時隱患。LNK2005 標準庫重複定義 99% 是運行時庫選項不一致。統一全解決方案為 /MTd (靜態) 或 /MDd (動態) 即可徹底解決。建議團隊規範統一選項,避免此類低級鏈接錯誤。