我稍微浏览了一下 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 …
根据定义存储在节中的变量是否是.data具有程序作用域的全局变量?换句话说,这两个词是否同义词,一个词暗示另一个词,或者,例如,是否可能有一个global未存储在该.data部分中的变量,或者一个不是全局的标签/变量?
举一个基本的例子:
// this is compiled as in the .data section with a .globl directive
char global_int = 11;
int main(int argc, char * argv[])
{
}
Run Code Online (Sandbox Code Playgroud)
会编译成类似的东西:
global_int:
.byte 11
main:
...
Run Code Online (Sandbox Code Playgroud)
但我正在查看这两个术语——全局和“在 .data 部分”是否是同一件事,或者是否有反例。