在編譯程序時,出現:
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/
以下是原文內容:
/////////////////////////////////////////////////////開始//////////////////////////////////////////////////
明明只定義了一次變量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