gcc -c x.c
告诉编译器从x.c文件创建目标代码,而不是尝试链接它,对吗?
-o
选项如何告诉编译器,如下所示?
gcc a.o y.o -o x.out
我的另一个问题是,当我有源代码时:
#include <stdio.h>
int main(){
puts("");
}
好的,编译器知道在哪里查找stdio.h
,但是可执行文件必须链接到stdio.o
,不是吗? stdio.o
文件驻留在哪里?
答案 0 :(得分:2)
它表示输出文件,即您的对象文件或可执行文件应该是什么。您可以通过gcc --help
或man gcc
来查看此信息。
<stdio.h>
是标准库的一部分,您的编译器已经链接到该标准库。
答案 1 :(得分:2)
见manpages.info/linux/gcc.1.html。在概要部分下,您将看到-o
选项。
关于
好的,编译器知道在哪里查找
stdio.h
,但是可执行文件必须链接到stdio.o
,不是吗?stdio.o
文件驻留在哪里?
第一个问题的答案是&#34;否&#34;。由于第一个问题的答案是&#34;否&#34;,第二个问题是不相关的。
stdio.h
中声明的函数和变量不必位于stdio.o
中。它们通常位于库(.a
或.so
)中,这些库位于链接器查找库文件的目录之一。
通常,没有规则每个.h
文件都有相应的.o
文件。可以在.h
文件中声明的函数和变量在多个.c
文件中实现,这将导致多个.o
文件。也可以在多个.h
文件中声明的函数和变量在一个.c
文件中实现。这些组织的方式因项目而异。
另一方面,每个.c
文件都有一个相应的.o
文件(我还没有看到任何可以编译多个.c
文件以创建一个文件的平台{ {1}}文件)。编译.o
文件所产生的所有.o
文件都链接在一起以创建可执行文件。
答案 2 :(得分:1)
gcc -o [file]
将构建输出写入输出文件。这不应与-O混淆,后者是优化级别。我不相信这个选项与链接有任何关系。