一個‘ multiple definition of’錯誤


在編譯程序時,出現:

make
g++ -c CSeq.cpp
g++  -o testmain testmain.o dbSeqAlign.o CSeq.o
dbSeqAlign.o:(.data+0x0): multiple definition of `PAM_250'
testmain.o:(.data+0x0): first defined here
dbSeqAlign.o:(.data+0x790): multiple definition of `gap_open'
testmain.o:(.data+0x790): first defined here
dbSeqAlign.o:(.data+0x794): multiple definition of `gap_ext'
testmain.o:(.data+0x794): first defined here
dbSeqAlign.o:(.bss+0x0): multiple definition of `alphabet'
testmain.o:(.bss+0x0): first defined here
collect2: ld returned 1 exit status
make: *** [testmain] Error 1

使勁的看了代碼,明明沒有重復定義啊,干脆把預定義不上

#ifndef

#define

#endif

結果還是老樣子

上網查了下,找到:http://bobactive.blog.163.com/blog/static/27936141200932592235724/

以下是原文內容:

/////////////////////////////////////////////////////開始//////////////////////////////////////////////////

multiple definition of XXX  

2009-04-25 21:22:35|  分類: 實驗室里的學習 |字號 訂閱

 

明明只定義了一次變量XXX,卻被編譯器告知:multiple definition of XXX
奇怪中,猜測,可能是與頭文件的include有關。

代碼如下:

 // ic.h
#ifndef __IC_H__
#define __IC_H__

float hisRatio=0.1;

/* other part omitted*/
#endif

 

 //ic.cpp

#include "ic.h"

float tmpValue=hisRatio;

/*other part omitted*/


編譯輸出信息:

 /tmp/ccAHyLaX.o:(.data+0x0): multiple definition of `hisRatio'
/tmp/ccLrvuCE.o:(.data+0x0): first defined here


想找到問題的找了很久,未果。

后來,參照別的常數的使用情況,在hisRatio的定義前面加上了const修飾。因為,在這個工程中,hisRation確實起到一個全局的常量。
結果,編譯成功,問題消失了。

O,原來如此。
hisRatio是在另外的文件中定義的,如果是變量的話,在不同的文件中使用的話一般要求使用前加上extern修飾聲明。
而,我的這個想被include進來使用。

總言之,常量前面加上const,就在所有include它的文件中可用了。

/////////////////////////////////////////結束/////////////////////////////////////////////////

實驗結果發現可以給全局變量的定義前面加上const或static


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM