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

Ami*_*823 0 c linker-errors extern

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

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

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

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

klu*_*utt 5

仅仅因为您已经说过 (extern) 变量是在其他地方定义的,但是您没有与包含变量定义的任何内容链接。

例子:

$ 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
Run Code Online (Sandbox Code Playgroud)

所以现在我们已经将源文件编译为目标文件。让我们链接:

$ 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
Run Code Online (Sandbox Code Playgroud)

哎呀,没有用。但这确实:

$ gcc main.o extern.o
$ ls
a.out  extern.c  extern.o  main.c  main.o
$ ./a.out 
10
$
Run Code Online (Sandbox Code Playgroud)

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

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