用gcc编译c语言程序以及其编译过程

简介: 对于初学c语言编程的我们来说,学会如何使用gcc编译器工具,对理解c语言的执行过程,加深对c语言的理解很重要!!! 1、预编译 --> 2、编译 --> 3、汇编 --> 4、链接----------------------------------------------------------------------------- 0、编写c代码,并输入以下如图代码,生成c文件hello.c。

 对于初学c语言编程的我们来说,学会如何使用gcc编译器工具,对理解c语言的执行过程,加深对c语言的理解很重要!!!

1、预编译 --> 2、编译 --> 3、汇编 --> 4、链接
-----------------------------------------------------------------------------

0、编写c代码,并输入以下如图代码,生成c文件hello.c。

-----------------------------------------------------------------------------

1、预编译(Preprocessing)命令:

会对各种预处理指令(#include、#define、#ifdef 等#开始的代码行)进行处理,删除注释和多余的空白字符,生成一份新的代码。

gcc -o hello.i hello.c -E 或者 gcc -o hello.i -E hello.c 或者 gcc -E hello.c -o hello.i
(注意:-o 作用是指定输出文件的名字,如果不加-o的话,则生成的文件名字总叫a.out。)

(即-o 参数:是对命令输出结果进行导入操作,这里是把 gcc -E hello.c 操作结果输出到文件hello.i(命名可以自定义)中进行保存。)

预编译hello.c,预编译之后得到的文件的名字叫hello.i

(注意:编译后的名字可以随意起,但是呢我们知道预编译后的文件还是文本的.c文件,所以为了好区分起名字为 xxx.c,这里我们为了显示整个过程,预编译后的文件名我们起为xxx.i。)

在c语言中#开头的语句又叫预编译指令。例如:#include <stdio.h>

预编译的功能之一:会把include包含的头文件内容做一个简单的替换,即替换到.c文件里面去。
......
//此处省略1万行
......
预编译的功能之二:会把代码中的注释去掉。

-----------------------------------------------------------------------------
2、编译(Compilation)的命令:

对代码进行语法、语义分析和错误判断,生成汇编代码文件。

gcc -o hello.s hello.i -S 或者 gcc -o hello.s -S hello.i 或者 gcc -S hello.i -o hello.s

(-S 参数:是gcc对目标文件进行编译,这里针对的是文件hello.i文件。)

通过这一步我们知道 C语言跟汇编的 关系,至于他们之前是如何进行转换的,大家可以进行更深入的学习与探讨。

此时目录下多了一个hello.s文件,内容如下图所示:

 

-----------------------------------------------------------------------------

3、汇编(Assembly)的命令:

把汇编代码转换成计算机可认识的二进制文件,即把文本的c语言编译为二进制指令。要知道计算机只认识0和1呢!

gcc -o hello.o hello.s -c 或者 gcc -o hello.o -c hello.s 或者 gcc -c hello.s -o hello.o

(-c 参数:是gcc对目标文件执行指令转换的操作。)

此步骤我们得到文件hello.o文件。

大家也同样打开文件(cat hello.o)查看一下,这个文件里面几乎没几个字符大家能看懂,这就对了,但大家可以通过这种方法将其转化为我们可读的形式:

root@iZ2zeeailqvwws5dcuivdbZ:~/2/01# readelf -a hello.o

-----------------------------------------------------------------------------
4、链接(Linking/Build)的命令:

通俗的讲就是把多个*.o文件合并成一个可执行文件,即二进制指令文件。

gcc -o hello hello.o  或者 gcc hello.o -o hello(注意:gcc没有单独的链接参数)

将系统库函数与hello.o进行链接(简言之合并),得到可执行的程序,该程序的名字叫hello。

root@iZ2zeeailqvwws5dcuivdbZ:~/2/01# gcc -o hello hello.o 

这里我们就得到了一个可以直接在系统下执行的文件 hello。

我们也可以对这个文件进行readelf操作,也可以进行二进制指令转汇编的操作,如下图所示:

root@iZ2zeeailqvwws5dcuivdbZ:~/2/01# objdump -d hello

-----------------------------------------------------------------------------

5、程序运行

我们想知道在linux系统下到底链接来了什么库来呢?(即可执行程序需要用到什么库呢?)
使用命令 ldd hello 查看。

(注意;用c语言写的代码依赖的库最少,如果使用其他语言依赖的库更多哦!!需要装好多包包。)

 

我的GitHub地址: https://github.com/heizemingjun
我的博客园地址: http://www.cnblogs.com/chenmingjun
我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun
Copyright ©2018 黑泽明军
【转载文章务必保留出处和署名,谢谢!】
相关文章
|
2月前
|
存储 自然语言处理 Unix
【C语言】C语言 4 个编译过程详解
编译是将源代码转换为目标代码的过程。它是在编译器的帮助下完成的。编译器检查源代码是否存在语法或结构错误,如果源代码没有错误,则生成目标代码。
90 1
|
3月前
|
NoSQL 编译器 C语言
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。高级技巧包括内存检查、性能分析和符号调试。通过实践案例学习如何有效定位和解决问题,同时注意保持耐心、合理利用工具、记录过程并避免过度调试,以提高编程能力和开发效率。
72 1
|
3月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
99 1
|
3月前
|
C语言
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性
C语言编程中,错误处理至关重要,能提升程序的健壮性和可靠性。本文探讨了C语言中的错误类型(如语法错误、运行时错误)、基本处理方法(如返回值、全局变量、自定义异常处理)、常见策略(如检查返回值、设置标志位、记录错误信息)及错误处理函数(如perror、strerror)。强调了不忽略错误、保持处理一致性及避免过度处理的重要性,并通过文件操作和网络编程实例展示了错误处理的应用。
101 4
|
3月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
99 5
|
3月前
|
网络协议 物联网 数据处理
C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势
本文探讨了C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势。文章详细讲解了使用C语言实现网络通信程序的基本步骤,包括TCP和UDP通信程序的实现,并讨论了关键技术、优化方法及未来发展趋势,旨在帮助读者掌握C语言在网络通信中的应用技巧。
81 2
|
3月前
|
程序员 C语言
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门
C语言中的指针既强大又具挑战性,它像一把钥匙,开启程序世界的隐秘之门。本文深入探讨了指针的基本概念、声明方式、动态内存分配、函数参数传递、指针运算及与数组和函数的关系,强调了正确使用指针的重要性,并鼓励读者通过实践掌握这一关键技能。
72 1
|
4月前
|
存储 文件存储 C语言
深入C语言:文件操作实现局外影响程序
深入C语言:文件操作实现局外影响程序
|
1月前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
36 3

热门文章

最新文章