2008-11-17 81 views
1

我有一个项目由两个文件main.c和logoff.c组成。当我尝试编译他们,我得到这个错误:有关重复符号的奇怪ld错误

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注销命名功能,但我已搜查main.c中的文本“注销”,并没有发现任何(该功能甚至没有叫!)。

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

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

+0

出于好奇,你是否将#include logoff.c放入main.c中? – 2008-11-17 22:18:58

+0

那是你的问题。将声明移动到像logoff.h这样的头文件,它会很好地编译。 – 2008-11-17 23:20:13

回答

2

只注销的函数声明创建logoff.h文件,像

void logoff(void);

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

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

2

你是否在main.c中包含或#import logoff.c?

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