GCC 中的 -o 选项是什么?

What is the -o option in GCC?

gcc -c x.c

告诉编译器从 x.c 文件创建目标代码,而不是尝试 link 它,对吗?

-o 选项告诉编译器什么,如下所示?

gcc a.o y.o -o x.out

我的另一个问题是,当我有这样的源代码时:

#include <stdio.h>

int main(){
    puts("");
}

好吧,编译器知道在哪里寻找 stdio.h,但是可执行文件必须 linked 到 stdio.o,不是吗? stdio.o 文件位于何处?

它表示输出文件,即您的目标文件或可执行文件应该是什么。您可以通过执行 gcc --helpman gcc.

查看此信息

<stdio.h> 是标准库的一部分,您的编译器已经链接到它。

gcc -o [file]

将构建输出写入输出文件。这不要与优化级别 -O 混淆。我不认为此选项与链接有任何关系。

参见 manpages.info/linux/gcc.1.html。在 Synopsis 部分下,您将看到 -o 选项。

关于

Well OK, the compiler knows where to look for stdio.h, but the executable must be linked to stdio.o, mustn't it? Where does the stdio.o file reside?

第一个问题的答案是"No"。由于第一个问题的答案是"No",所以第二个问题不相关。

stdio.h中声明的函数和变量不必在stdio.o中。它们通常位于库(.a.so)中,该库位于链接器查找库文件的目录之一中。

一般来说,没有规定每个.h文件都有对应的.o文件。可以在多个 .c 文件中实现在 .h 文件中声明的函数和变量,这将导致多个 .o 文件。也可以让在多个 .h 文件中声明的函数和变量在一个 .c 文件中实现。这些组织方式因项目而异。

另一方面,每个 .c 文件都有一个对应的 .o 文件(我还没有看到任何平台可以编译多个 .c 文件来创建一个 .o 文件)。编译 .c 文件产生的所有 .o 文件都链接在一起以创建可执行文件。