日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++中的“error:LNK2005 已经在*.obj中定义”异常

發(fā)布時(shí)間:2023/12/18 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++中的“error:LNK2005 已经在*.obj中定义”异常 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.



C++中的“error:LNK2005 已經(jīng)在*.obj中定義”異常問(wèn)題

 異常現(xiàn)象如下:

 

C++中的“error:LNK2005 已經(jīng)在*.obj中定義”異常問(wèn)題(圖1)

?  “error LNK2005: 已經(jīng)在*.obj中定義”

  編程中經(jīng)常能遇到LNK2005錯(cuò)誤——重復(fù)定義錯(cuò)誤,其實(shí)LNK2005錯(cuò)誤并不是一個(gè)很難解決的錯(cuò)誤,弄清楚它形成的原因,就可以輕松解決它了。?

1. 造成LNK2005錯(cuò)誤主要有以下幾種情況:

  (1)重復(fù)定義全局變量。可能存在兩種情況:

  【1】對(duì)于一些初學(xué)編程的程序員,有時(shí)候會(huì)以為需要使用全局變量的地方就可以使用定義申明一下。其實(shí)這是錯(cuò)誤的,全局變量是針對(duì)整個(gè)工程的。

  正確的應(yīng)該是在一個(gè)CPP文件中定義如下:

   int?? g_Test;   那么在使用的CPP文件中就應(yīng)該使用:    extern?? int?? g_Test   即可,如果還是使用int?? g_Test,那么就會(huì)產(chǎn)生LNK2005錯(cuò)誤,一般錯(cuò)誤錯(cuò)誤信息類似:   “*.obj?? error?? LNK2005?? int?? book?? c??? already?? defined?? in ? *.obj”   切記的就是不能給變量賦值否則還是會(huì)有LNK2005錯(cuò)誤。?   這里需要的是“聲明”,不是“定義”!   根據(jù)C++標(biāo)準(zhǔn)的規(guī)定,一個(gè)變量是聲明,必須同時(shí)滿足兩個(gè)條件,否則就是定義:??

  ①? 聲明必須使用extern關(guān)鍵字   ②? 不能給變量賦初值?   所以,下面的是聲明: ?     extern?? int?? a;??

  下面的是定義??

    int?? a;??     int?? a?? =?? 0;??     extern?? int?? a?? =0;?

  【2】對(duì)于那么編程不是那么嚴(yán)謹(jǐn)?shù)某绦騿T,總是在需要使用變量的文件中隨意定義一個(gè)全局變量,并且對(duì)于變量名也不予考慮,這也往往容易造成變量名重復(fù),而造成LNK2005錯(cuò)誤。 ?   (2)頭文件的包含重復(fù)。     往往需要包含的頭文件中含有變量、函數(shù)、類的定義,在其它使用的地方又不得不多次包含之,如果頭文件中沒(méi)有相關(guān)的宏等防止重復(fù)鏈接的措施,那么就會(huì)產(chǎn)生LNK2005錯(cuò)誤。   【1】解決辦法是在需要包含的頭文件中做類似的處理:

#ifndef MY_H_FILE //如果沒(méi)有定義這個(gè)宏 #define MY_H_FILE //定義這個(gè)宏 ……. //頭文件主體內(nèi)容 ……. #endif

   【2】上面是使用宏來(lái)做的,也可以使用預(yù)編譯來(lái)做,在頭文件中加入

#pragma once //頭文件主體

  【3】綜合兩者都 使用

#pragma once

#ifndef MY_H_FILE //如果沒(méi)有定義這個(gè)宏

#define MY_H_FILE //定義這個(gè)宏

……. //頭文件主體內(nèi)容

…….

#endif

//頭文件主體   (3)使用第三方的庫(kù)造成的。   這種情況主要是C運(yùn)行期函數(shù)庫(kù)和MFC的庫(kù)沖突造成的。   具體的辦法就是將那個(gè)提示出錯(cuò)的庫(kù)放到另外一個(gè)庫(kù)的前面。   另外選擇不同的C函數(shù)庫(kù),可能會(huì)引起這個(gè)錯(cuò)誤。      微軟和C有兩種C運(yùn)行期函數(shù)庫(kù),【1】一種是普通的函數(shù)庫(kù):LIBC.LIB,不支持多線程。【2】另外一種是支持多線程的:msvcrt.lib。   如果一個(gè)工程里,這兩種函數(shù)庫(kù)混合使用,可能會(huì)引起這個(gè)錯(cuò)誤,一般情況下它需要MFC的庫(kù)先于C運(yùn)行期函數(shù)庫(kù)被鏈接,因此建議使用支持多線程的msvcrt.lib。所以在使用第三方的庫(kù)之前首先要知道它鏈接的是什么庫(kù),否則就可能造成LNK2005錯(cuò)誤。   如果不得不使用第三方的庫(kù),可以嘗試按 下面所說(shuō)的方法修改,但不能保證一定能解決問(wèn)題,前兩種方法是微軟提供的:?      選擇VC菜單Project->Settings->Link->Catagory選擇Input,再在Ignore?? libraries?? 的Edit欄中填入你需要忽略的庫(kù),             如:Nafxcwd.lib;Libcmtd.lib。然后在Object/library?? Modules的Edit欄中填入正確的庫(kù)的順序,這里需要你能確定什么是正確的順序,呵呵,God?? bless?? you!?   ②  選擇VC菜單Project->Settings->Link頁(yè),然后在Project?? Options的Edit欄中輸入/verbose:lib,這樣就可以在編譯鏈接程序過(guò)程中在輸出窗口看到鏈接的順序了。?   ③  選擇VC菜單Project->Settings->C/C++頁(yè),Catagory選擇Code?? Generation后再在User?? Runtime?? libraray中選擇MultiThread?? DLL等其他庫(kù),逐一嘗試。 參考網(wǎng)址:       http://www.cnblogs.com/MuyouSome/p/3332699.html

總結(jié)

以上是生活随笔為你收集整理的C++中的“error:LNK2005 已经在*.obj中定义”异常的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。