我有这个错误:
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
答案 0 :(得分:5)
这意味着在链接期间报告错误,而不是编译。
在对象模块的最开始报告链接错误(我的猜测是在它将第一个数据发送到.text段之前)。
简而言之:它在这里并不重要,但是其他链接器错误我可以参考例如使用未解决的外部的地方。多个定义显然出现在多个位置,这显然是链接器无法确定要报告的位置的原因。
提示 99%的情况发生在非通用非实例方法(在本例中为CISP430_A5::charList_join
)在头文件而不是cpp文件中定义时。该方法是静态方法吗?
编辑确实问题是该方法在标题中定义为。 linked_list.h的第201行包含 linked_list.template,表示包含linked_list.template中的所有定义。实际上,这与直接在头文件中定义 相同。
现在,因为
linked_list.h
包含在main.cpp
和permute_append.cpp
main.o
和permute_append.o
都被链接到main
可执行文件你最终会得到两个相互矛盾的全局自由函数定义charList_join
。我修复了内容并上传到my gist
答案 1 :(得分:3)
.text
是包含可执行指令的段(在对象,库或可执行文件或内存中)。在.text+0x0
0x0
只是一个偏移量。因此,整个permute_append.cpp:(.text+0x0)
表示通过编译permute_append.cpp创建的目标文件中文本段的开头(即字节0x0)。
由于这是一个链接错误,对你来说真正重要的是给出的符号名称,即CISP430_A5::charList_join(char const*, CISP430_A5::linked_list<char>)
。