同時出現LNK2005 和LNK1169 error 的解決辦法
- 專案場景:Visual Studio C++專案
- 問題描述
- 原因分析
- cpp參考cpp導致報錯
- 解決方案
- 方案1:如果是簡單的專案,可以先移除被參考的cpp檔案,在解決方案管理器中新建頭檔案,將被移除的cpp檔案內容拷貝進來,效果如下,
- 方案2:正規措施是:給被參考的cpp檔案創建單獨的頭檔案,再將此頭檔案引入到需要的檔案中,效果如下:
- 問題總結
專案場景:Visual Studio C++專案
Visual Studio 的C++ 專案中,在main.cpp中引入LinkStack.cpp時會出現以下報錯:
問題描述

嚴重性 代碼 說明 專案 檔案 行 禁止顯示狀態
錯誤 LNK1169 找到一個或多個多重定義的符號 queue2 F:\Cplusplus\queue2\Debug\queue2.exe 1
警告 C6011 取消對 NULL 指標“p”的參考, queue2 F:\Cplusplus\queue2\LinkStack.cpp 33
錯誤 LNK2005 “void __cdecl DestroyStack(struct node * &)” (?DestroyStack@@YAXAAPAUnode@@@Z) 已經在 LinkStack.obj 中定義 queue2 F:\Cplusplus\queue2\main.obj 1
錯誤 LNK2005 “int __cdecl GetTop(struct node *,char &)” (?GetTop@@YAHPAUnode@@AAD@Z) 已經在 LinkStack.obj 中定義 queue2 F:\Cplusplus\queue2\main.obj 1
錯誤 LNK2005 “void __cdecl InitStack(struct node * &)” (?InitStack@@YAXAAPAUnode@@@Z) 已經在 LinkStack.obj 中定義 queue2 F:\Cplusplus\queue2\main.obj 1
錯誤 LNK2005 “int __cdecl Pop(struct node * &,char &)” (?Pop@@YAHAAPAUnode@@AAD@Z) 已經在 LinkStack.obj 中定義 queue2 F:\Cplusplus\queue2\main.obj 1
錯誤 LNK2005 “int __cdecl Push(struct node * &,char)” (?Push@@YAHAAPAUnode@@D@Z) 已經在 LinkStack.obj 中定義 queue2 F:\Cplusplus\queue2\main.obj 1
錯誤 LNK2005 “int __cdecl StackEmpty(struct node *)” (?StackEmpty@@YAHPAUnode@@@Z) 已經在 LinkStack.obj 中定義 queue2 F:\Cplusplus\queue2\main.obj 1

原因分析
cpp參考cpp導致報錯
在這個Visual Studio專案中,main.cpp通過#include <LinkStack.cpp>直接參考另一個cpp檔案,導致出現上述報錯,但是在Visual Studio中不能夠在一個cpp檔案中參考另一個cpp檔案,因為在Visual Studio中的每個cpp源檔案在沒有被main.cpp參考時也都會被編譯為obj檔案,所以在被直接#include引入cpp檔案時會被報出已定義的錯誤,
解決方案
方案1:如果是簡單的專案,可以先移除被參考的cpp檔案,在解決方案管理器中新建頭檔案,將被移除的cpp檔案內容拷貝進來,效果如下,

方案2:正規措施是:給被參考的cpp檔案創建單獨的頭檔案,再將此頭檔案引入到需要的檔案中,效果如下:

問題總結
Visual Studio中因為每個源檔案都必定會被編譯一遍,因此不能在一個源檔案中直接參考另一個源檔案,只能以頭檔案的形式進行參考,
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/271401.html
標籤:其他
