C 我们在哪里使用.i文件以及如何生成它们?
在浏览GCC手册页时,我发现以下行:C 我们在哪里使用.i文件以及如何生成它们?,c,gcc,file-extension,C,Gcc,File Extension,在浏览GCC手册页时,我发现以下行: file.i C source code that should not be preprocessed. 我知道运行gcc-efoo.c会在预处理后停止编译器; 但是创建.i文件的实际应用程序是什么呢 还有一种方法可以生成.i文件,而不是gcc foo.c-E>foo.i?该.i文件也称为“纯c文件”。在预处理阶段 将包括头文件 宏将被替换 注释将被删除 用于条件编译。 如果您查看.i文件,您可以看到以下内容 生成.i文件的命令无
file.i
C source code that should not be preprocessed.
我知道运行gcc-efoo.c
会在预处理后停止编译器;
但是创建.i
文件的实际应用程序是什么呢
还有一种方法可以生成
.i
文件,而不是gcc foo.c-E>foo.i
?该.i
文件也称为“纯c文件”。在预处理阶段
.i
文件,您可以看到以下内容.i
文件的命令无效-
gcc -E foo.c -o foo.i
文件.i
文件是:
不应预处理的C源代码
来源:mangcc
然后搜索“\.i
”详细步骤:
man gcc
,然后按/键进行搜索,然后键入\.i
,然后按Enter键,然后反复按n键直到找到它
这意味着.i
文件是预处理的源代码,因此它已经包含:
#
字符开头,例如:
将生成一个约682行长的main.i
文件,上面显示的main()
函数就在最末尾
如何生成所有中间文件,包括.i
文件:
我的首选是在项目的本地bin
文件夹中一次生成所有中间文件(.i
、.o
、.s
),而不仅仅是使用-E
)生成.i
文件,如下所示:
mkdir bin
gcc -save-temps=obj foo.c -o ./bin/foo
现在,“foo/bin”目录中有以下内容:
运行程序时,当然要使用:
./bin/foo
关于“对象文件”和“可执行文件”的说明
请注意,最终输出,即foo
可执行文件,被称为“编译的二进制程序”、“程序”(组合的)“目标文件”、“可执行文件”、“二进制文件”,或只是“机器代码”或“一和零”(10101010)。它是一个对象文件格式的对象文件,链接器将单个“*.o”对象文件合并成一个文件来创建它。链接器将所有“*.o”对象文件合并为一个文件,以使最终的foo
可执行或组合对象文件
GNU链接器(ld
)手册说明如下。请参阅“3.1基本链接器脚本概念”一节(添加了重点,以及方括号中的内容[]
):
3.1基本链接器脚本概念
为了描述链接器脚本语言,我们需要定义一些基本概念和词汇表
链接器将输入文件[单个*.o对象文件]组合成一个单一输出文件。输出文件和每个输入文件都采用称为对象文件格式的特殊数据格式。每个文件称为对象文件。输出文件通常称为可执行文件,但出于我们的目的,我们也将其称为对象文件。除其他外,每个对象文件都有一个节列表。我们有时将输入文件中的一个部分称为输入部分;类似地,输出文件中的节也是输出节
更多信息。在对象文件上,您还可以在此处看到我的其他两个答案:
另一种方法是
gcc--save temps-o foo foo.c
一种实际用途是报告编译器错误。您发送触发bug的.i
文件,以便没有您的标题的人可以复制该文件。
gcc -Wall -std=c99 -O0 -save-temps=obj main.c -o ./bin/main
mkdir bin
gcc -save-temps=obj foo.c -o ./bin/foo
foo # compiled binary program (AKA: combined "object file",
# "executable", "binary", "program", or "machine code")
foo.i # intermediate, preprocessed C file
foo.o # individual object file
foo.s # assembly file
./bin/foo