在编译程序时,出现:
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