【问题标题】:Strange ld error about duplicate symbol关于重复符号的奇怪 ld 错误
【发布时间】:2008-11-17 22:15:24
【问题描述】:

我有一个项目,它包含两个文件,main.c 和 logoff.c。当我尝试编译它们时,我得到了这个错误:

gcc -c -g -Wall main.c
gcc -c -g -Wall logoff.c
gcc -o main -g -Wall main.o logoff.o
ld: duplicate symbol _logoff in logoff.o and main.o

我在 logoff.c 中有一个名为 logoff 的函数,但我在 main.c 中搜索了文本“logoff”,但什么也没找到(甚至还没有调用该函数!)。

如果我将函数的名称更改为 log_off,它就可以工作。文件中还有第二个函数会导致同样的错误,除非它的名称也被更改。

有什么原因会发生这种情况吗?我在两个不同的系统上有这个问题。可能相关的一件事是我在另一个项目中使用了相同的 logoff.c 文件,但它没有连接到这个。

【问题讨论】:

  • 出于好奇,您是否将 #include logoff.c 放入 main.c 中?
  • 那是你的问题。将声明移动到像 logoff.h 这样的头文件中,它会编译得很好。

标签: c gcc ld compiler-errors duplicate-symbol


【解决方案1】:

创建一个logoff.h文件,只有logoff的函数声明,比如

void logoff(void);

然后,在 main.c 中包含 #include "logoff.h"。不要包含 logoff.c,因为编译器会对该函数进行两次编译,然后链接器会看到两个同名的函数。

如果您将其更改为 log_off,然后只重新编译其中一个,它似乎可以工作。另一个目标文件仍将编译旧的注销功能。因此,链接器会看到一个 log_off 和一个 logoff。这就是它似乎为您使用该名称的原因。

【讨论】:

    【解决方案2】:

    你在 main.c 中是#include 还是 #import logoff.c ?

    你做到了——那是你的问题。 logoff.c 包含在 main.c 中,因此 main 定义了 _logoff 和 _main。现在您还要编译 logoff.c,它定义了 _logoff。然后你尝试链接这两者,这意味着生成的二进制文件包括符号 _main、_logoff 和 _logoff,这正是链接器告诉你的内容。

    【讨论】:

      猜你喜欢
      • 2012-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多