在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
总结:(源文件名为loops.c) 可以转换到不同阶段。阶段1,将头文件加进来。阶段2,转换成汇编程序,与机器类型相关。阶段3,转换成机器码,但不完整。阶段4,链接其他系统文件,形成最终可执行文件 cc -E -o loops-firststep.e loops.c cc -c loops.c#此时出现.o文件。或者,更可控地:cc -c -o loops-third.o loops.c cc -o loops-final loops.c#链接成最终可执行文件
转一:
Compiling a C program is a multi-stage process. At an overview level, the process can be split into four separate stages: Preprocessing, compilation, assembly, and linking. In this post, I’ll walk through each of the four stages of compiling the following C program:
#包含头文件The first stage of compilation is called preprocessing. In this stage, lines starting with a Before interpreting commands, the preprocessor does some initial processing. This includes joining continued lines (lines ending with a To print the result of the preprocessing stage, pass the
Given the “Hello, World!” example above, the preprocessor will produce the contents of the
#转成机器相关的汇编语言The second stage of compilation is confusingly enough called compilation. In this stage, the preprocessed code is translated to assembly instructions specific to the target processor architecture. These form an intermediate human readable language. The existence of this step allows for C code to contain inline assembly instructions and for different assemblers to be used. Some compilers also supports the use of an integrated assembler, in which the compilation stage generates machine code directly, avoiding the overhead of generating the intermediate assembly instructions and invoking the assembler. To save the result of the compilation stage, pass the
This will create a file named
#转换成机器码,生成.o文件During this stage, an assembler is used to translate the assembly instructions to object code. The output consists of actual instructions to be run by the target processor. To save the result of the assembly stage, pass the
Running the above command will create a file named
#链接缺失部分,成为真正可执行文件The object code generated in the assembly stage is composed of machine instructions that the processor understands but some pieces of the program are out of order or missing. To produce an executable program, the existing pieces have to be rearranged and the missing ones filled in. This process is called linking. The linker will arrange the pieces of object code so that functions in some pieces can successfully call functions in other ones. It will also add pieces containing the instructions for library functions used by the program. In the case of the “Hello, World!” program, the linker will add the object code for the The result of this stage is the final executable program. When run without options,
转二:
GCC编译器的基本选项如下表:
C语言的include头文件
头文件的注意事项:
转三:
C语言编译和链接详解(通俗易懂,深入本质)我们平时所说的程序,是指双击后就可以直接运行的程序,这样的程序被称为可执行程序(Executable Program)。在 Windows 下,可执行程序的后缀有 puts("VIP会员");
二进制的写法为:
在计算机发展的初期,程序员就是使用这样的二进制指令来编写程序的,那个拓荒的年代还没有编程语言。
直接使用二进制指令编程对程序员来说简直是噩梦,尤其是当程序比较大的时候,不但编写麻烦,需要频繁查询指令手册,而且除错会异常苦恼,要直接面对一堆二进制数据,让人眼花缭乱。另外,用二进制指令编程步骤繁琐,要考虑各种边界情况和底层问题,开发效率十分低下。 编译(Compile)
C语言代码由固定的词汇按照固定的格式组织起来,简单直观,程序员容易识别和理解,但是对于CPU,C语言代码就是天书,根本不认识,CPU只认识几百个二进制形式的指令。这就需要一个工具,将C语言代码转换成CPU能够识别的二进制指令,也就是将代码加工成
.exe 程序的格式;这个工具是一个特殊的软件,叫做编译器(Compiler)。 注意:不了解编译原理并不影响我们学习C语言,我也不建议初学者去钻研编译原理,贪多嚼不烂,不要把自己绕进去。 C语言的编译器有很多种,不同的平台下有不同的编译器,例如:
链接(Link)
C语言代码经过编译以后,并没有生成最终的可执行文件(.exe 文件),而是生成了一种叫做目标文件(Object File)的中间文件(或者说临时文件)。目标文件也是二进制形式的,它和可执行文件的格式是一样的。对于 Visual C++,目标文件的后缀是 总结不管我们编写的代码有多么简单,都必须经过「编译 --> 链接」的过程才能生成可执行文件:
转四:
linker input file unused because linking not done
GCC是Linux平台下常用的编译链接器。编译链接的过程分为: 源代码-->预处理文件(.i)-->编译后的汇编代码(.s)-->汇编后的二进制文件(.o)-->链接后的二进制物件(无后缀)。 处理程序分别是 :cpp、ccl、as、ld。 使用 -v选项,可以看到各个阶段关联的处理程序。 使用gcc -E 指示gcc对源代码进行预处理,结果直接输出到终端。 使用gcc -S 指示gcc编译成为汇编语言 使用gcc -c 指示gcc直至形成二进制文件(不进行链接) 使用gcc 指示gcc链接形成二进制物件(多个二进制模块链接形成大的模块或者可执行程序) 因此你需要的目标文件的种类是 -E、-S、-c或者不带这些参数确定的, 源文件可以是中间文件的一种。-o参数控制的仅仅是输出文件的名称。 但是gcc默认会根据源文件的后缀去判断应该调用处理程序的那些。例如源文件的后缀是.c,则gcc -E使用的是cpp,gcc -c则使用cpp、ccl、as。如果源文件的后缀是.o,则gcc -E 是无法进行的,会报错:linker input file unused because linking not done。这是gcc发现这个应该进行链接,但是选项指示不使用linker程序,因而报这种错误信息。如果源文件是二进制的文件,但是保存的源文件后缀却是.c,则gcc会当作这是.c文件,如果采用gcc不带参数,则gcc会很多错,因为它把这个文件当作源代码处理的。 注意:这里,源文件指的是gcc的输入文件,源代码指的是程序源代码文件。
GCC编译器的基本选项如下表:
C语言的include头文件
头文件的注意事项:
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论