谁能告诉我这是哪个错误。链接器错误或编译器错误

Can anyone please tell me which error it is . linker error or compiler error

谁能解释一下为什么是链接器错误?

假设变量i没有在任何其他文件中定义。

#include <stdio.h>
int main()
{
    extern int i;
    i=10;
    printf("%d",i);

    return 0;
}

只是因为您已经说过 (extern) 变量是在其他地方定义的,但是您还没有 link编辑任何包含变量定义的内容。

示例:

$ cat > main.c
#include <stdio.h>
int main()
{
    extern int i;
    i=10;
    printf("%d\n",i);
}

$ cat > extern.c
int i;

$ gcc -c main.c 
$ gcc -c extern.c
$ ls
extern.c  extern.o  main.c  main.o

现在我们已经将源文件编译成目标文件了。让我们 link:

$ gcc main.o
/usr/bin/ld: main.o: in function `main':
main.c:(.text+0x6): undefined reference to `i'
/usr/bin/ld: main.c:(.text+0x10): undefined reference to `i'
collect2: error: ld returned 1 exit status

糟糕,没用。但这确实:

$ gcc main.o extern.o
$ ls
a.out  extern.c  extern.o  main.c  main.o
$ ./a.out 
10
$

Assuming that the variable i is not defined in any other file.

这是一个很奇怪的假设,因为extern基本上意味着它是在另一个文件中定义的。你们都假设它是在另一个文件中定义的,但事实并非如此。这与询问为什么在尝试打开一个不存在的文件时出现错误是一回事。如果你做出相互矛盾的假设,你应该预料到会遇到一些麻烦,因为没有麻烦确实是奇怪的。 :)

问题是您将变量 i 声明为 extern,但您没有 link 任何具有变量 i 定义的变量。

进一步阅读:Extern C++