“error LNK1169: 找到一个或多个多重定义的符号”的解决方法
問題描述如下:
有 三個(gè)源文件,A.h、B.cpp、C.cpp。
A.h是頭文件,其中聲明了三個(gè)變量a1、a2、 a3。
B.cpp是A.h中所聲明的類的實(shí)現(xiàn)源代碼,C.cpp是主程序文件。B.cpp和C.cpp中均包含頭文件 A.h。
在編譯時(shí),編譯能夠通過,但鏈接時(shí)出了問題,出現(xiàn)”error?? LNK1169:?? 找到一個(gè)或多個(gè)多重定義的符號(hào)“的錯(cuò)誤。
經(jīng)過分析,確定了這是由于兩個(gè)實(shí)現(xiàn)文件中重復(fù)包含了頭文件而造成的。可解決方法卻始終找不到。
要 注意的是,在這里,在頭文件中加入#ifndef……#endif這樣的預(yù)編譯命令是沒用的,因?yàn)檫@是防止嵌套包含頭文件的,而本例中并沒有嵌套包含,是 在兩個(gè)文件中分別包含。
因?yàn)檫@三個(gè)變量在兩個(gè)實(shí)現(xiàn)文件中都要用到,所以一定要包含在A.h中。后來在網(wǎng)上找到了解決方法,其實(shí)很簡單。
就是在A.h中的三個(gè)變量聲明前加上extern 關(guān)鍵字,然后在B.cpp中不加extern關(guān)鍵字再次聲明這三個(gè)變量。于是編譯鏈接順利通過。
其實(shí)這是C++中比較基礎(chǔ)的問題。
還有種情況是定義了函數(shù),但在另個(gè)文件中準(zhǔn)備用#include打開,但是結(jié)果還是會(huì)出現(xiàn)。
直接包含不就在兩個(gè)cpp文件中都定義了相同的函數(shù)/變量嗎,鏈接時(shí)會(huì)出現(xiàn)重復(fù)定義(你自己試試),所以需要使用extren申明一下即可,他們使用的是同一個(gè)實(shí)體。
例如:
1、你在a.cpp中定義了一個(gè)函數(shù)
void func()
{
}
希望在b.cpp中調(diào)用,調(diào)用前就需要進(jìn)行聲明,格式如下:
extren void func(); //extren 后面根的形式和函數(shù)定義形式要完全相同
void mian()
{
??? func();
}
2、1、你在a.cpp中定義了一個(gè)變量? int a;
希望在b.cpp中使用,使用前就需要進(jìn)行聲明,格式如下:
extren int a; //extren 后面根的形式和變量定義形式要完全相同
void main()
{
??? int b = a;
}
總結(jié)
以上是生活随笔為你收集整理的“error LNK1169: 找到一个或多个多重定义的符号”的解决方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: good-Windows下搭建PHP开发
- 下一篇: 工作流中ServiceTask的各种方法