1. 程式人生 > >關於VS2008編譯錯誤"error LNK2005: 已經在 .obj 中定義"

關於VS2008編譯錯誤"error LNK2005: 已經在 .obj 中定義"

無意中遇到了這樣的編譯問題, 於是google,發現在.h檔案裡定義變數,發生這問題的概率是灰常大的.

下面這段紅字是參考網上的說法:

當你第一個使用這個頭的.cpp檔案生成.obj的時候,int i 在裡面定義了當另外一個使用這個的.cpp再次[單獨]生成.obj的時候,int i 又被定義然後兩個obj被另外一個.cppinclude 這個頭的,連線在一起,就會出現重複定義.

不過經過一輪研究發現.. 其實這說法不怎麼正確.. 最起碼對VS來說..

經過實驗, 發現只要有兩個cpp同時包含一個定義了變數的.h檔案,就會提示錯誤.

再回想下剛考完的編譯原理, obj是什麼?  其實就是cpp翻譯後的一坨中間程式碼.. 一般編譯過程就是把cpp先翻譯成obj, 最後把obj再連線成exe. 這樣,不管中間有沒有第三者把前兩個連線一起, 最終obj還是會彙集在一起.. 下面可以看到,錯誤發生在連結,而不是翻譯..

正在連結...
1>3.obj : error LNK2005: "int i" ([email protected]@3HA) 已經在 2.obj 中定義
1>D:\程式設計之美\vs2008程式碼\dfsdfadsfec\Debug\dfsdfadsfec.exe : fatal error LNK1169: 找到一個或多個多重定義的符號

本人得出的結論:

只要兩個或者以上的.cpp同時包含了一個定義了變數的.h檔案,就會提示錯誤.

不過注意, 這中間可能會包含些比較複雜的邏輯關係.. 

例如我的那坨程式碼.. 

假定一個定義了變數的1.h檔案

有1.cpp和2.cpp, 1.cpp包含1.h,   2.cpp只包含2.h  但是2.h包含了1.h..  所以1.h中定義的變數編譯的時候會在2.pp中有定義. 於是乎2.cpp翻譯成的obj裡也會有定義, 結果導致提示obj裡重定義.

在標頭檔案和cpp檔案錯中複雜的情況下, 根本就很難判斷其禍根源.

所以得出結論:

沒事就別在.h中定義變數,或者初始化靜態成員變數(我就是後一種情況).

不過有種比較酷的做法, 就是直接改成.c編譯.  據說c裡遇到重定義,  會忽略為宣告.

本文轉自

相關推薦

關於VS2008編譯錯誤"error LNK2005: 已經在 .obj 定義"

無意中遇到了這樣的編譯問題, 於是google,發現在.h檔案裡定義變數,發生這問題的概率是灰常大的. 下面這段紅字是參考網上的說法: 當你第一個使用這個頭的.cpp檔案生成.obj的時候,int i 在裡面定義了當另外一個使用這個的.cpp再次[單獨]生成.obj的時候,int i 又被定義然後兩個o

[Visual Studio C++] [MFC 除錯錯誤]:error LNK2005: "class std::...已經在 Multimediatimer.obj 定義

1.編譯問題描述: error LNK2005: "class std::basic_ofstream<char,struct std::char_traits<char> > Sim_Data_Write" ([email protected]@[email&

2&gt;MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: _calloc 已經在 LIBCMTD.lib(dbgcalloc.obj) 定義

ont cal 鏈接器 使用 size lib rac amp svc 使用VS2010,在FireBreath裏面調用ortp庫和Speex庫。編譯的時候出現錯誤: 2>MSVCRTD.lib(MSVCR100D.dl

1>test.obj : error LNK2005: _main 已經在 main.obj 定義【c的學習之路】

下決心要在空餘時間學習C語言,從今天開始。 遇到的一個小問題,查詢資料結果如下。 造成LNK2005錯誤主要有以下幾種情況: 1.重複定義全域性變數。可能存在兩種情況: A、對於一些初學程式設計的程式設計師,有時候會以為需要使用全域性變數的地方就可

error LNK2005:已經在 XXX.obj 定義/fatal error LNK1120: 1 個無法解析的外部命令

>main.obj : error LNK2005: "void __cdecl Creat_graph(struct graph *)" ([email protected]@[em

error:LNK2005 _main 已經在 *.obj 定義

出現這個錯誤有如下幾種情況 重複定義全域性變數。可能存在兩種情況 A:這種情況一般存在於建立的工程之中,我用的是vs2015.全域性變數是針對整個工程的。正確的應該是在一個CPP檔案中定義如下:int g;那麼在使用的CPP檔案中就應該使用:ext

VS 編譯出現 LNK2005 XXX 已經在 XXX.obj 定義

    造成該問題的可能性比較多,本人將在今後遇到時新增進來,今天先放出本人遇到的一種情況。     多重包含含有變數定義的.h檔案所造成     這個現象很容易重新,首先新建一個1.h檔案,然後在裡

error:LNK2005 已經在*.obj定義

實習專案中涉及到靜態庫的編寫,在用例項除錯靜態庫的時候,遇到LNK2005重複定義錯誤:已經在“*.obj”中定義。 上網搜了一下,總結有如下幾種情況: 1、重複定義全域性變數 全域性變數是針對整個工程的,在一個CPP檔案的定義:int nCount;那麼在使用的CPP檔案

C++報錯:error LNK2005: _main 已經在 1.obj 定義

C++初學者可能會遇到這樣的報錯:error LNK2005: _main 已經在 1.obj 中定義。 這個報錯的意思是說你的當前工程裡定義了兩個main()主函式,在C++裡是不允許出現兩個入口的,即不能出現兩個main()主函式。 解決方法: 方法1:去掉一個主函

vs2008編譯錯誤fatal error C1902: 程序數據庫管理器不匹配;請檢查安裝解決

不清楚 錯誤 管理器 編譯 ror 匹配 原因 nbsp erro 重裝了本本上的Xp系統,如往常一樣,升級,裝殺毒軟件,開發工具。一些進行的非常順利。然而,在我打開VS2008準備耕作的時候,盡然出現了一邪惡的錯誤提示:vs2008編譯錯誤fatal error C19

【VS開發】VS編譯時提示"已經在 LIBCMT.lib(new.obj) 定義uafxcw.lib"解決辦法

  錯誤  1  error LNK2005: "void * __cdecl operator new(unsigned int)" ( [email protected]@Z )

VS2008編譯錯誤error C2065: 'PMIB_TCPSTATS' : undeclared identifier c:\program files (x86)\microsoft sdks\windows\v7.0a\include\iphlpapi.h 411

  安裝了VS2008編譯之前的程式,結果出現了編譯錯誤,以為是VS2008的Sp1補丁沒裝好,重灌補丁後還是不行,編譯錯誤如下:      雙擊錯誤會定位在iphlpapi.h中,   一個可行的解決辦法是:把iphlpapi.h檔案的line386---line421 都註釋掉了:      然

LNK2005:htons已經在Win32_Interop.lib(Win32_FDAPI.obj)定義

今天編譯一個專案,在兩個標頭檔案中都呼叫了 winsock2.h,然後出現如題錯誤, 經過半天查詢及網上資料搜尋,最終通過https://stackoverflow.com/questions/137

C++已經在 test.obj 定義”的錯誤

在使用模板過程中,容易發生這樣的錯誤。 錯誤原因如下: 1.模板類的申明和實現要在一個檔案裡面。當我們所有實現都是用模板時,我們會知道應該放在一個檔案裡面,不會範錯誤。但如果有的用了模板,而有的沒用模板的時候,這個時候就容易出現問題了。如果把申明放在.h,實現在

orbslam編譯錯誤error: static assertion failed

Ubuntu16.04後編譯報錯,提示: /usr/local/include/eigen3/Eigen/src/Core/util/StaticAssert.h:32:40: error: static assertion failed: YOU_MIXED_DIFFERENT_NUMERIC

androidstudio2.3.1 ndk 編譯錯誤error: clang frontend command failed with exit code 70 (use -v to

問題描述 android ndk編譯公司舊程式碼時出現如下錯誤: clang.exe: error: clang frontend command failed with exit code 70 (use -v to see invocation) 原因分析&查詢

Android Studio 升級到3.0後出現編譯錯誤Error:Cannot choose between the following configurations of project

前段時間將Android Studio 升級到3.0後,原本一切正常的專案出現編譯錯誤 Error:Cannot choose between the following configurations of project :**:  - debugApiElements 

編譯錯誤error: invalid storage class 編譯錯誤error: invalid storage class

編譯錯誤error: invalid storage class 2013年02月01日 09:54:41 閱讀數:5809 昨天遇到一個莫名其妙的編譯錯誤,以前沒有見過,而且程式碼流程看起來也沒有太多的奇異之處。後來忍無可

Qt編譯錯誤Error - RtlWerpReportException failed with status code :-1073741823

這是一個比較新手入門常見的問題,其實說白了就是記憶體洩漏,很具體的說大部分就是你對類裡面的一個指標變數沒有初始化,一下面的例子為例,m_tooltip未初始化為0導致後面的判斷未申請記憶體導致記憶體洩漏 #ifndef MYBARVIEW_H #define MYBARVIEW_H #incl

編譯錯誤 error: control may reach end of non-void function

編譯錯誤:您提交的程式碼無法完成編譯 第1行6:1: error: control may reach end of non-void function [-Werror,-Wreturn-type] } ^1 error generated. 產生錯誤的原因:在某些情況