AIX 6.1:警告:重复符号:

时间:2011-10-19 13:00:19

标签: c aix

我正忙着将用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

为什么符号在上面重复?

再次感谢

林顿

1 个答案:

答案 0 :(得分:2)

链接器尝试链接包含具有相同名称的对象的对象文件。

假设您没有明确声明使用相同名称的不同对象,这很可能是通过将相同的源编译为不同的目标文件而发生的,然后这些文件又被传递给链接器。

这种情况的一个常见情况是让编译器#include一些来源多一次。

另一种可能的情况是,您使用相同的源创建两个库,并尝试将它们链接到主对象。

或者您将源中的源包含到主构建中。

在任何此类情况下,链接器都会窒息。