我稍微浏览了一下 Stackoverflow 和更广泛的互联网,发现导致此错误的最常见原因是声明( int var = 1;) 和定义( int var;) 的合并,以及包含文件.c中的文件.h。
我刚刚从一个文件分成几个文件的小项目没有做任何这些事情。我很困惑。
我制作了该项目的副本,并删除了副本中的所有代码(这很有趣),直到到达这里:
#include "a.h"
int main() {
}
Run Code Online (Sandbox Code Playgroud)
#ifndef A_H
#define A_H
int test;
#endif
Run Code Online (Sandbox Code Playgroud)
#include "a.h"
Run Code Online (Sandbox Code Playgroud)
几乎是规范的,对吧?但是...
$ rm *.o; gcc -g -c a.c; gcc -g -c main.c; gcc -o main main.o a.o
/usr/bin/ld: a.o:/.../a.h:5: multiple definition of `test'; main.o:/.../a.h:5: first defined here
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
瓦特:(
大约在这个时候,我开始质疑我的配置,并尝试了另一台机器,通过 NFS …