“permute_append.cpp :(。text + 0x0)”中的“(。text + 0x0)”对于此C ++错误意味着什么?

时间:2011-11-04 23:00:21

标签: c++ compiler-errors

我有这个错误:

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

2 个答案:

答案 0 :(得分:5)

这意味着在链接期间报告错误,而不是编译。

在对象模块的最开始报告链接错误(我的猜测是在它将第一个数据发送到.text段之前)。

简而言之:它在这里并不重要,但是其他链接器错误我可以参考例如使用未解决的外部的地方。多个定义显然出现在多个位置,这显然是链接器无法确定要报告的位置的原因。

提示 99%的情况发生在非通用非实例方法(在本例中为CISP430_A5::charList_join)在头文件而不是cpp文件中定义时。该方法是静态方法吗?

编辑确实问题是该方法在标题中定义为。 linked_list.h的第201行包含 linked_list.template,表示包含linked_list.template中的所有定义。实际上,这与直接在头文件中定义 相同。

现在,因为

  • linked_list.h包含在main.cpppermute_append.cpp
  • main.opermute_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>)