linux gcc编译c文件头文件,使用GCC编译器编译C语言
凶猪下山
转载
关注
0点赞·1047人阅读
GCC编译C源代码有四个步骤:预处理—->编译—->汇编—->链接。
可以利用GCC的参数来控制执行的过程,这样就姿耐可以更深入的了解编译C程序的过程。
下面将通过对一个程序的编译来演示整个过程。
#include
int main()
{
printf("happy new year!\n")
return 0
}
1:预处理:编译器将C程序的头文件编译进来,还有宏的替换,可以用gcc的参数-E来参看。
预处理 命令:gcc -E hello.c -o hello.i
作用:将hello.c预处理输出hello.i
2:编译:这个阶段编译器主要做词法分析、语法分析、语义分析等,在检查无错误后后,把代码翻核凳译成汇编语言。可用gcc的参数-S来参看。
编译器(ccl)将文本文件hello.i 翻译成文本文件hello.s, 它包含一个汇编语言程序。汇编语言程序中的每条语句都以一种标准的文本格式描述了一条低级机器语言指令。
编译命令:gcc -S hello.i -o hello.s
作用:将预处理输出文件hello.i汇编成hello.s文件
3:汇编:把编译阶段生成的.s 文件转换为二进制目标代码。可用gcc的参数-c来参看。汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成可重定位目标程序的格式, 并将结果保存在目标文件hello.o中。hello.o文件是一个二进制文件,它的字节编码是机器语言。
汇编 命令:gcc -c hello.s -o hello.o
作用:作用:将汇编输出文件hello.s编译输出hello.o文件
4:链接:把obj文件链接为可执行的文改册旅件:链接器(ld)负责.o文件的并入。结果就是hello文件,它是一个课执行的目标文件,可以加载到存储器后由系统调用。
链接命令:gcc hello.o -o hello
一步 *** 作的话是: (-o必须在hello之前 )
$gcc hello.c -o hello
$./hello或者:(会默认生成a.out文件)
$gcc hello.c
$./a.out
在终端中输入 gcc 文件名 -o 目标文件名\x0d\x0a然后 ./目标文件名 就行了,没有目标文件名,自动喊裂存为 a\x0d\x0a执行 ./a 就行了。\x0d\x0a\x0d\x0a在使用Gcc编译器的时候,我们必须给出一系列必要的调用参数和文件名称。GCC编译器的调用参数大约有100多个,其中多数参数我们可能根本就用不到,这里只介绍其中最基本、最常用的参数。\x0d\x0aGCC最基本的用法是∶gcc [options] [filenames]\x0d\x0a其中options就是编译器所需要的参数,filenames给出相关的文件名称。\x0d\x0a-c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。\x0d\x0a-o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。\x0d\x0a-g,产生符号调试工具(GNU的gdb)所必要的符号资讯,要想对源代码进行调试,我们就必须加入这个选项。\x0d\x0a郑悔闭-O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就前知相应地要慢一些。\x0d\x0a-O2,比-O更好的优化编译、连接,当然整个编译、连接过程会更慢。\x0d\x0a-Idirname,将dirname所指出的目录加入到程序头文件目录列表中,是在预编译过程中使用的参数。C程序中的头文件包含两种情况∶\x0d\x0aA)#include \x0d\x0aB)#include “myinc.h”\x0d\x0a其中,A类使用尖括号(),B类使用双引号(“ ”)。对于A类,预处理程序cpp在系统预设包含文件目录(如/usr/include)中搜寻相应的文件,而B类,预处理程序在目标文件的文件夹内搜索相应文件。 \x0d\x0a\x0d\x0aGCC执行过程示例\x0d\x0a\x0d\x0a示例代码 a.c:\x0d\x0a#include \x0d\x0aint main()\x0d\x0a{\x0d\x0aprintf("hello\n")\x0d\x0a}\x0d\x0a预编译过程:\x0d\x0a这个过程处理宏定义和include,并做语法检查。\x0d\x0a可以看到预编译后,代码从5行扩展到了910行。\x0d\x0agcc -E a.c -o a.i\x0d\x0acat a.c | wc -l\x0d\x0a5\x0d\x0acat a.i | wc -l\x0d\x0a910\x0d\x0a编译过程:\x0d\x0a这个阶段,生成汇编代码。\x0d\x0agcc -S a.i -o a.s\x0d\x0acat a.s | wc -l\x0d\x0a59\x0d\x0a汇编过程:\x0d\x0a这个阶段,生成目标代码。\x0d\x0a此过程生成ELF格式的目标代码。\x0d\x0agcc -c a.s -o a.o\x0d\x0afile a.o\x0d\x0aa.o: ELF 64-bit LSB relocatable, AMD x86-64, version 1 (SYSV), not stripped\x0d\x0a链接过程:\x0d\x0a链接过程。生成可执行代码。链接分为两种,一种是静态链接,另外一种是动态链接。使用静态链接的好处是,依赖的动态链接库较少,对动态链接库的版本不会很敏感,具有较好的兼容性;缺点是生成的程序比较大。使用动态链接的好处是,生成的程序比较小,占用较少的内存。\x0d\x0agcc a.o -o a\x0d\x0a程序运行:\x0d\x0a./a\x0d\x0ahello\x0d\x0a编辑本段\x0d\x0aGCC编译简单例子\x0d\x0a\x0d\x0a编写如下代码:\x0d\x0a#include \x0d\x0aint main()\x0d\x0a{\x0d\x0aprintf("hello,world!\n")\x0d\x0a}\x0d\x0a执行情况如下:\x0d\x0agcc -E hello.c -o hello.i\x0d\x0agcc -S hello.i -o hello.s\x0d\x0agcc -c hello.s -o hello.o\x0d\x0agcc hello.c -o hello\x0d\x0a./hello\x0d\x0ahello,world!方法/步骤
1、进入linux系统,创建C文件“vim test.c”同时进入vim编辑界面也可以利用指令“touch test.c”创建后,然后让模“vim test.c”进入vim编辑界面。
2、vim编辑界面,由“ESC”建来切换三种模式,一般模式:在Linux终端中输入“vim 文件名”就进入了一般模式,但不能输入文字。编辑模式:在一陵做般模式下按i就会进入编辑模式,此时就可以写程序,按Esc可回到一般模式。
命令模式:在一般模式下按:就会进入命令模式,左下角会有一个冒号出现,此时可以敲入命令并执行。键盘“a”键可以直接进入编辑模式
3、通过输入底部指令“:set nu”显示行数。
4、输入完C代码后,记得“ESC”键切换,输入“:wq”保存退出。
5、指令“ls”显示当前目录下文件,我尺滑衡们可以见到存在的C文件编译“gcc -o test test.c”编译成功后,运行“./test”。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)