我有一个由两个文件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中搜索了文本<!> quot; logoff <!> quot;并没有找到任何东西(该功能甚至还没有被调用!)。

如果我将函数的名称更改为log_off,则可以正常工作。文件中有第二个函数,除非其名称也被更改,否则会导致相同的错误。

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

有帮助吗?

解决方案

使用logoff的函数声明创建一个logoff.h文件,如

void logoff(void);

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

如果将其更改为log_off,然后只重新编译其中一个,它似乎可行。另一个对象文件仍将编译旧的注销函数。因此链接器会看到一个log_off和一个注销。这就是它似乎以这个名字为你工作的原因。

其他提示

你在main.c中#include或#import logoff.c吗?

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top