我有这个错误:
permute_append.o: In function `CISP430_A5::charList_join(char const*, CISP430_A5::linked_list<char>)':
permute_append.cpp:(.text+0x0): multiple definition of `CISP430_A5::charList_join(char const*, CISP430_A5::linked_list<char>)'
main.o:main.cpp:(.text+0x0): first defined here
collect2: ld returned 1 exit status
make: *** [main] Error 1(.text+0x0)是什么意思?我习惯于看到行:列号(例如57:68),但我不知道(.text+0x0)是什么意思。
下面是代码:https://gist.github.com/1340872/e25ec2aaac99c4005f4b33e6236750a2a6f1791f
发布于 2011-11-05 07:01:58
这意味着错误是在链接期间报告的,而不是在编译过程中报告的。
链接错误是在对象模块的最开始时报告的(我猜是在它向.text段发出第一个数据之前)。
简而言之:这在这里是无关紧要的,但其他链接器错误可能会引用到,例如使用未解析外部的地方。多个定义显然出现在多个位置,这显然是链接器无法决定报告哪个位置的原因。
提示当在头文件而不是cpp文件中定义非泛型非实例方法(在本例中为CISP430_A5::charList_join)时,99%的情况下会发生这种情况。该方法是静态方法吗?
编辑实际上,问题是该方法是在头中定义的。linked_list.h 的第201行包含 linked_list.template,这意味着包含来自linked_list.template的所有定义。实际上,这等同于将定义直接放在头文件中。
现在,因为
main.cpp和permute_append.cpp 中都包含
linked_list.h main.o和permute_append.o都链接到main可执行文件中
您最终会得到全局自由函数charList_join的两个相互冲突的定义。我修复了一些东西并上传到了my gist
发布于 2011-11-05 07:06:04
.text是包含可执行指令的段(在对象、库或可执行文件中或在内存中)。在.text+0x0中,0x0只是一个偏移量。因此,整个permute_append.cpp:(.text+0x0)表示通过编译permute_append.cpp创建的目标文件中文本段的开始(即字节0x0)。
由于这是一个链接错误,对您来说真正重要的是给定的符号名称,即CISP430_A5::charList_join(char const*, CISP430_A5::linked_list<char>)。
https://stackoverflow.com/questions/8016696
复制相似问题