我正忙着将用C语言编写的应用程序从Solaris SPARC 10移植到AIX 6.1。
我收到大量“WARNING: Duplicate symbol:
”错误。我已尝试使用#ifndef
仅在需要时包含头文件,但仍会获得相同的重复项。
任何想法会导致什么?我看过类似的帖子,但没有具体的内容。
作为一个例子,我得到了:
ld: 0711-224 WARNING: Duplicate symbol: onCheckCallbackFunc
ld: 0711-224 WARNING: Duplicate symbol: onCommitCallbackFunc
ld: 0711-224 WARNING: Duplicate symbol: onConfirmCallbackFunc
ld: 0711-224 WARNING: Duplicate symbol: onRollbackCallbackFunc
ld: 0711-224 WARNING: Duplicate symbol: onMessageArrivedCallbackFunc
如果我在该lib上运行以下命令:
nm -X64 ./libtest.so
我得到以下内容(只是一个片段)
onCheck:F-1 - 692
onCheckCallbackFunc B 536877592 8
onCheckCallbackFunc d 536877064 8
onCheckCallbackFunc:G820 - 0
onCommit D 536876400
onCommit d 536876400 24
onCommit d 536877024 8
onCommit:F-1 - 824
onCommitCallbackFunc B 536877600 8
onCommitCallbackFunc d 536877072 8
onCommitCallbackFunc:G820 - 0
onConfirm D 536876424
onConfirm d 536876424 24
onConfirm d 536877032 8
onConfirm:F-1 - 956
onConfirmCallbackFunc B 536877608 8
onConfirmCallbackFunc d 536877080 8
onConfirmCallbackFunc:G820 - 0
为什么符号在上面重复?
再次感谢
林顿
答案 0 :(得分:2)
链接器尝试链接包含具有相同名称的对象的对象文件。
假设您没有明确声明使用相同名称的不同对象,这很可能是通过将相同的源编译为不同的目标文件而发生的,然后这些文件又被传递给链接器。
这种情况的一个常见情况是让编译器#include一些来源多一次。
另一种可能的情况是,您使用相同的源创建两个库,并尝试将它们链接到主对象。
或者您将源和中的源包含到主构建中。
在任何此类情况下,链接器都会窒息。