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

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

下決心要在空餘時間學習C語言,從今天開始。
遇到的一個小問題,查詢資料結果如下。

造成LNK2005錯誤主要有以下幾種情況:

1.重複定義全域性變數。可能存在兩種情況:
A、對於一些初學程式設計的程式設計師,有時候會以為需要使用全域性變數的地方就可以使用定義申明一下。其實這是錯誤的,全域性變數是針對整個工程的。
  正確的應該是在一個CPP檔案中定義如下:
  int g_Test;
  那麼在使用的CPP檔案中就應該使用:
  extern int g_Test
  即可,如果還是使用int g_Test,那麼就會產生LNK2005錯誤,一般錯誤錯誤資訊類似:
  .obj error LNK2005 int book c? already defined in

.obj
  切記的就是不能給變數賦值否則還是會有LNK2005錯誤。
  這裡需要的是“宣告”,不是“定義”!根據C++標準的規定,一個變數是宣告,必須同時滿足兩個條件,否則就是定義:
  (1)宣告必須使用extern關鍵字
  (2)不能給變數賦初值
  所以,下面的是宣告:
    extern int a;
  下面的是定義
    int a;
    int a = 0;
    extern int a =0;
B、對於那麼程式設計不是那麼嚴謹的程式設計師,總是在需要使用變數的檔案中隨意定義一個全域性變數,並且對於變數名也不予考慮,這也往往容易造成變數名重複,而造成LNK2005錯誤。

2.標頭檔案的包含重複
  往往需要包含的標頭檔案中含有變數、函式、類的定義,在其它使用的地方又不得不多次包含之,如果標頭檔案中沒有相關的巨集等防止重複連結的措施,那麼就會產生LNK2005錯誤。解決辦法是在需要包含的標頭檔案中做類似的處理:
#ifndef MY_H_FILE //如果沒有定義這個巨集
#define MY_H_FILE //定義這個巨集
……. //標頭檔案主體內容
…….
#endif
上面是使用巨集來做的,也可以使用預編譯來做,在標頭檔案中加入:
#pragma once
//標頭檔案主體

3.使用第三方的庫造成的
  這種情況主要是C執行期函式庫和MFC的庫衝突造成的。具體的辦法就是將那個提示出錯的庫放到另外一個庫的前面。另外選擇不同的C函式庫,可能會引起這個錯誤。微軟和C有兩種C執行期函式庫,一種是普通的函式庫:LIBC.LIB,不支援多執行緒。另外一種是支援多執行緒的:msvcrt.lib。如果一個工程裡,這兩種函式庫混合使用,可能會引起這個錯誤,一般情況下它需要MFC的庫先於C執行期函式庫被連結,因此建議使用支援多執行緒的msvcrt.lib。所以在使用第三方的庫之前首先要知道它連結的是什麼庫,否則就可能造成LNK2005錯誤。如果不得不使用第三方的庫,可以嘗試按下面所說的方法修改,但不能保證一定能解決問題,前兩種方法是微軟提供的:
A、選擇VC選單Project->Settings->Link->Catagory選擇Input,再在Ignore libraries 的Edit欄中填入你需要忽略的庫,如:Nafxcwd.lib;Libcmtd.lib。然後在Object/library Modules的Edit欄中填入正確的庫的順序,這裡需要你能確定什麼是正確的順序,呵呵,God bless you!
B、選擇VC選單Project->Settings->Link頁,然後在Project Options的Edit欄中輸入/verbose:lib,這樣就可以在編譯連結程式過程中在輸出視窗看到連結的順序了。
C、選擇VC選單Project->Settings->C/C++頁,Catagory選擇Code Generation後再在User Runtime libraray中選擇MultiThread DLL等其他庫,逐一嘗試。

相關推薦

1>test.obj : error LNK2005: _main 已經main.obj 定義c學習

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

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

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

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

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

Java學習---1List的ArrayList和LinkedList的KTV點歌系統修改

本程式碼是參考書籍敲出 ,加入了部分自己的東西讓程式完善一些,謝謝!!! KTVArrayList程式碼: 1 import java.util.Scanner; 2 import java.util.ArrayList; 3 4 public class KTVByArrayList {

Qt 學習---安裝篇QT5.7.1+VS2013軟體開發環境配置

參考:https://blog.csdn.net/liushuiwen101423/article/details/70882534 安裝任務:完成Qt5.7.1載入到VS2013環境下,程式設計執行Qt應用程式,有詳細步驟,最後完成一個空白視窗UI執行顯示1.基本配置PC

2>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

mfcs100ud.lib(dllmodul.obj) : error LNK2005: [email

今天用VC2010寫一個用了MFC的規則DLL,編譯時報告如題錯誤。 必應後發現這篇文章  error LNK2005: [email protected] 已經在 MSVCRTD.lib(dllmain.obj) 中定義   http://wangl

連結錯誤nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??

最近在VC 6.0上作業,有幾個地方都遇到一個十分惱人的錯誤。就是出現下述的錯誤: Linking... nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" ([email

nafxcwd.lib(dllmodul.obj) : error LNK2005: [email&#

朋友編寫一個dll,編譯時總出現"nafxcwd.lib(dllmodul.obj) : error LNK2005: [email protected]..."錯誤!後發現是,其建立dll時選擇的時不使用MFC,而後來工程中又添加了與MFC相關的東西.才引起上述問題.採用如

LIBCMT.lib(crt0dat.obj) : error LNK2005 錯誤的解決方法

最近為了解決跨lib之間vector產生的問題,將link的Code Generation的Use run-time library 修改為MultiThreaded Dll,結果導致了系列錯誤。 LIBCMT.lib(crt0dat.obj) : error LNK2005: _exit alread

libcmtd.lib(crt0dat.obj) : error LNK2005: _exit already defined in msvcrtd.lib(MSVCRTD.dll) 編譯錯誤解決方法

[問題描述] 今天在VC6下編譯G279軟體時,已編譯通過,連結時報一下錯誤: Linking...libcmtd.lib(crt0dat.obj) : error LNK2005: _exit already defined in msvcrtd.lib(MSVCRTD.d

連結錯誤LIBCMT.lib(crt0dat.obj) : error LNK2005以及fatal error C1189: #error

正在連結... LIBCMT.lib(crt0dat.obj) : error LNK2005: _exit 已經在 msvcrtd.lib(MSVCR71D.dll) 中定義 LIBCMT.lib(crt0dat.obj) : error LNK2005: __exit 已經在 msvcrtd.lib(MS

1. 編寫一個類ExceptionTest,在main方法使用try-catch-finally語句結構實現:

語句結構 scanner -c out bsp 處理 test sys finall package bbb; import java.util.Scanner; public class aaa { public static void main

Python學習——day 1

exc 默認 image java imp final python ret ber Python安裝   前往官網下載安裝包,選擇自己需要的Python版本。現在的Python早已進入3.x時代,最好選擇3.x的版本。2.x的版本已不在更新,且將在2020年停止服務。  

python爬蟲學習-遇錯筆記-1

sig packages ror caused 技術 bsp img exception mage 當在編寫爬蟲時同時開啟了Fidder解析工具時,訪問目標站點會遇到以下錯誤: File "C:\Users\litao\AppData\Local\Programs\P

python學習1

對象 是否 font 得到 spa 一個 部分 ont style 一、python 符號運算 + 加 - 兩個對象相加 - 減 - 得到負數或是一個數減去另一個數 * 乘 兩個數相乘或是返回一個被重復若幹次的字符串 / 除 - x除以y % 取模

Python 學習1 了解Python的編譯原理,運行速度

可能 程序集 nbsp 錯誤 解釋 .exe 完成 字節 方便 為什麽學習Python呢? 目前有許多的開發語言,其中運行速度最快的無疑是C語言了,因為C是最接近機器的語言,但是為什麽還有其他的各種語言呢,因為完成C語言的功能可能需要更多的代碼,而其他的語言可能需要

PHP-學習1

則表達式 字符串 開發流程 模式 配置 這一 目前 這就是 項目結構   相信入職快有5個月了,目前項目做過HIS,zySystem,ComStoreSystem當然今天不是來介紹的,後期直到第四個月後APP護身寶經理拍板今後也就是明年正式交於我們團隊接手與擴展,運維。雖然

FPGA小白學習1) System Verilog的概念以及與verilog的對比

函數返回 enable 傳遞 轉換操作符 st2 輸出 時間值 擴展 isa 轉自CSDN:http://blog.csdn.net/gtatcs/article/details/8970489 SystemVerilog語言簡介 SystemVerilog是一種硬件描

scrapy的學習1(簡單的例子)

strong os.path pro tle text arch try mobile pip scrapy的安裝 環境:python3.6 1 pip install -i https://pypi.douban.com/simple/ scrapy 2