天天看點

C++經典錯誤之already defined in .obj解決方法之補充

 最近在項目中,編寫了一個ini檔案的操作類,在被其他代碼引用的過程中,總是會出現連結錯誤,即error LNK2005:already defined in .obj,記得最開始寫C++代碼時,也出現過這種錯誤,經過網絡資料,最後還是順利的解決了,但是這次的情況和以前有些不同,應該不算是這類錯誤的典型,後來經過嘗試,解決了這個問題。

       首先,介紹下一般典型的發生該錯誤的情況及解決辦法。以下内容摘自網絡,網址為http://hi.baidu.com/3512/blog/item/d568bc340c002cb4d0a2d3d6.html。

       程式是如下形狀:一個頭檔案.h,一個主函數.cpp,一個操作函數.cpp。操作函數包含頭檔案,然後主函數包含操作函數.cpp。運作時就會出現該錯誤。

解決方案一:

把主函數所包含的操作函數.cpp,改為頭檔案.h,然後就可以解決如上錯誤。

解決方案二:

重新打開編譯器,重新打開剛才的檔案,先打開主函數.cpp,然後編譯運作,打開Fileview,其中有一個external dependencies,把頭檔案.h,和操作函數.cpp添加到這裡,這樣再編譯運作主函數.cpp,程式運作成功!

       其次,說說本人遇到這個錯誤的代碼情況。該ini的操作類中包含了兩個模闆函數,是以将所有的成員函數就放到了頭檔案.h當中,被引用時隻要包含該頭檔案就可以了,即#include “***.h”,但是當在多個地方這樣操作的時候,就會出現上面的錯誤。其實本質上,本人的情況也和上述一緻,隻是形式發生了一些變化,是以上面介紹的解決方法就有些不夠全面了,這裡給予補充一下。

       解決方案:

       添加相應的cpp檔案,并将頭檔案.h中的非模闆函數都移到cpp檔案,而模闆函數的實作都放到檔案.h中,這樣,當多處引用該頭檔案的時候,就不會再出現該錯誤。

本文轉自jazka 51CTO部落格,原文連結:http://blog.51cto.com/jazka/643462,如需轉載請自行聯系原作者

繼續閱讀