C语言开发者的利器:gcc编译命令指南

本文主要介绍gcc编译c语言过程,以及常用命令

文章目录

  • C语言编译过程
    • 1. 预处理(Preprocessing):
    • 2. 编译(Compiling):
    • 3. 汇编(Assembling):
    • 4. 链接(Linking):
    • 实例
  • GCC 编译命令
    • 编译选项:
    • 链接选项:
    • 其他选项:

C语言编译过程

C语言编译过程是将源代码转换为可执行程序的过程,包括预处理、编译、汇编和链接四个主要阶段。以下是对每个阶段的详细介绍:

1. 预处理(Preprocessing):

  • 在这个阶段,首先对源文件进行预处理。预处理器根据源文件中的指令,如#include、#define等,展开宏定义,处理条件编译指令,以及包含头文件等。
  • 预处理器的输出结果是一个经过预处理的中间文件,通常以.i作为文件扩展名。

2. 编译(Compiling):

  • 经过预处理的中间文件被送入编译器进行编译,编译器将源代码翻译成相应的汇编代码。
  • 这个阶段主要包括词法分析、语法分析、语义分析和优化等步骤。编译器会对语法进行检查,并生成相应的汇编语言文件。这个阶段的输出通常是以.s作为文件扩展名的汇编语言文件。

3. 汇编(Assembling):

  • 汇编器将汇编代码转换成目标文件,目标文件包含了可重定位的机器码。
  • 汇编器将汇编语言文件转换为机器语言文件,通常以.o作为文件扩展名的目标文件。
  • 在汇编阶段,汇编器将汇编代码转换为机器码指令。每一条汇编指令对应一条机器码指令,并生成目标文件。目标文件是一种二进制格式文件,其中包含了机器指令和数据。

4. 链接(Linking):

  • 链接器将目标文件与所需的库文件进行链接,生成最终的可执行文件。
  • 在链接过程中,链接器会进行符号解析、重定位和地址空间分配等工作,以确保各个模块之间能正确地连接起来。
  • 最终生成的可执行文件可以在计算机上直接运行。

链接的作用主要有以下几个方面:

  • 符号解析:在编译过程中,源代码中的函数和变量可能会被定义在不同的源文件中或外部库中。链接器负责解析这些符号引用,并将其与相应的定义关联起来,确保所有的符号引用都能正确地找到对应的定义。

  • 重定位:编译器生成的目标文件中,包含了相对于源代码中的符号位置的地址偏移量。链接器负责将这些相对地址转换为绝对地址,并将不同目标文件中的代码和数据按照正确的偏移量进行合并,以生成最终的可执行文件。

  • 库文件链接:在编译过程中,经常会使用到各种库文件,包括系统提供的标准库和第三方库。链接器会将目标文件与这些库文件进行链接,以解析并满足对库函数的引用。

链接的过程可以分为两种类型:静态链接和动态链接。

  • 静态链接库文件可以是静态库(.a 或 .lib),静态链接器会将目标文件和库文件的代码和数据合并到一个单独的可执行文件中。在运行时,所有的代码和数据都被复制到内存中,程序独立运行,不再依赖于外部的库文件。静态链接生成的可执行文件相对较大,但具有更好的独立性和可移植性。

  • 动态链接动态库(.so 或 .dll),动态链接器将目标文件生成一个可执行文件,但并不将所有的库代码和数据都合并进去,而是在程序运行时再去加载所需的动态链接库。这样可以减小可执行文件的大小,并且多个程序可以共享同一个动态链接库的实例,减少内存占用。动态链接需要在运行时保证所需的动态链接库存在于系统中。

实例

下面以hello world实例为例子:

#include <stdio.h>

int main() {

    printf("hello world\n");
    return 0;
}
  1. 预处理:
  • 预处理阶段展开头文件和宏定义。
  • 我们可以使用以下命令进行预处理:gcc -E main.c -o main.i
  • 运行命令后会生成一个经过预处理的中间文件main.i,其中包含了main.c中所有的头文件和宏定义的展开内容。
gcc -E main.c -o main.i

在这里插入图片描述

  1. 编译
gcc -S main.i -o main.s
	.section	__TEXT,__text,regular,pure_instructions
	.build_version macos, 14, 0	sdk_version 14, 0
	.globl	_main                           ; -- Begin function main
	.p2align	2
_main:                                  ; @main
	.cfi_startproc
; %bb.0:
	sub	sp, sp, #32
	.cfi_def_cfa_offset 32
	stp	x29, x30, [sp, #16]             ; 16-byte Folded Spill
	add	x29, sp, #16
	.cfi_def_cfa w29, 16
	.cfi_offset w30, -8
	.cfi_offset w29, -16
	mov	w8, #0
	str	w8, [sp, #8]                    ; 4-byte Folded Spill
	stur	wzr, [x29, #-4]
	adrp	x0, l_.str@PAGE
	add	x0, x0, l_.str@PAGEOFF
	bl	_printf
	ldr	w0, [sp, #8]                    ; 4-byte Folded Reload
	ldp	x29, x30, [sp, #16]             ; 16-byte Folded Reload
	add	sp, sp, #32
	ret
	.cfi_endproc
                                        ; -- End function
	.section	__TEXT,__cstring,cstring_literals
l_.str:                                 ; @.str
	.asciz	"hello world\n"

.subsections_via_symbols

  1. 汇编

汇编阶段将汇编代码转换成目标文件

gcc -c main.s -o main.o
  1. 链接

链接阶段将目标文件与库文件链接,生成可执行文件。
运行命令后会生成一个名为myprogram的可执行文件,其中包含了main.o和helper.o的机器码,并链接了所需的库文件。

gcc main.o helper.o -o myprogram

在这里插入图片描述

GCC 编译命令

gcc 是 GNU Compiler Collection 的缩写,它是一个功能强大的编译器套件,支持多种编程语言,包括 C、C++、Objective-C、Fortran、Ada 等。下面是 gcc 命令的一些常用选项和参数的详细解析:

编译选项:

  • -c:只编译不链接,生成目标文件(.o 文件)。
    示例:gcc -c hello.c

  • -E:只进行预处理,不进行编译和链接,将预处理结果输出到标准输出。
    示例:gcc -E hello.c

  • -I<include_path>:添加头文件搜索路径。
    示例:gcc -I/usr/local/include hello.c

  • -D<macro>:定义预处理宏,相当于 #define 指令。
    示例:gcc -DDEBUG hello.c

  • -O<level>:指定编译优化级别,其中 可以是 0、1、2 或 3,分别表示不优化、基本优化、更多优化、最大优化。
    示例:gcc -O2 hello.c

链接选项:

  • -o <output_file>:指定输出的文件名,即生成的可执行文件的名称。
    示例:gcc hello.o -o hello

  • -L<library_path>:添加库文件搜索路径。
    示例:gcc -L/usr/local/lib hello.o -o hello

  • -l<library_name>:链接指定的库文件。
    示例:gcc hello.o -lmylib -o hello

  • -static:静态链接所有库文件,生成静态可执行文件。
    示例:gcc hello.o -static -o hello

  • -shared:生成共享库(动态链接库)。
    示例:gcc -shared hello.o -o libhello.so

  • -fPIC:生成位置无关的代码,用于共享库的编译。
    示例:gcc -fPIC -c hello.c

其他选项:

  • -g:在可执行文件中加入调试信息,以便进行程序调试和跟踪。
    示例:gcc -g hello.c -o hello

  • -Wall:开启所有常见的警告信息,有助于发现潜在的代码问题。
    示例:gcc -Wall hello.c -o hello

  • -std=<standard>:指定使用的语言标准,如 -std=c11 表示使用 C11 标准。
    示例:gcc -std=c11 hello.c -o hello

  • -pthread:添加对 POSIX 线程的支持。
    示例:gcc -pthread hello.c -o hello

  • -M:生成依赖关系,用于 Makefile 的自动生成。
    示例:gcc -M hello.c > hello.d


参考链接:

  • https://blog.csdn.net/qq_42570601/article/details/121261526
  • http://blog.chinaunix.net/uid-26212859-id-3774650.html
  • https://blog.csdn.net/weixin_42307601/article/details/128853010

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/162274.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

适用于 Windows 的 10 个最佳视频转换器:快速转换高清视频

您是否遇到过由于格式不兼容而无法在您的设备上播放视频或电影的情况&#xff1f;您想随意播放从您的相机、GoPro 导入的视频&#xff0c;还是以最合适的格式将它们上传到媒体网站&#xff1f;您的房间里是否有一堆 DVD 光盘&#xff0c;想将它们转换为数字格式以便于播放&…

深度模型压缩研究回顾

深度模型压缩研究回顾 作者&#xff1a;安静到无声 个人主页 目录 深度模型压缩研究回顾推荐专栏 在本节中&#xff0c;主要介绍了目前主流的深度神经网络压缩与加速方法&#xff0c;主要包括轻量化网络设计、参数量化、知识蒸馏、模型剪枝和硬件加速等&#xff0c;其中模型剪…

Linux系统中sh脚本编写

文章目录 Linux系统中sh脚本编写1.在编写sh脚本前了解一下基本语法1.1 if语句单分支双分支多分枝 1.2 for语法 2. 自己写的demo &#xff1a;自动部署前端项目 &#xff08;自动拉取代码&#xff0c;打包&#xff0c;部署nginx&#xff09;3.定时执行 shell脚本 Linux系统中sh脚…

性能分析工具的使用

文章目录 1. 数据库服务器调优的步骤2. 查看系统性能参数3. 统计SQL的查询成本&#xff1a;last_query_cost4. 定位执行慢的SQL&#xff1a;慢查询日志4.1 开启slow_query_log4.2 修改long_query_time阈值4.3 查看慢查询数目4.4 慢查询日志分析工具&#xff1a;mysqldumpslow 5…

work环境配置

1.计算机右键找到属性 2.配置环境变量 3.新加环境变量 4.修改环境变量path .bat文件内容 php ApplicationsChatstart_register.php ApplicationsChatstart_gateway.php ApplicationsChatstart_businessworker.php pause

App测试入门

App测试基础知识 App测试&#xff0c;是指对移动应用软件&#xff08;如手机app、平板app等&#xff09;进行全面和系统的测试&#xff0c;以确保其功能、性能、安全性、稳定性、兼容性等方面能满足用户的使用需求和期望。 App常见运行系统 IOS系统&#xff1a; IOS系统是苹果公…

MLC-LLM 支持RWKV-5推理以及对RWKV-5的一些思考

自从2023年3月左右&#xff0c;chatgpt火热起来之后&#xff0c;我把关注的一些知乎帖子都记录到了这个markdown里面&#xff0c;&#xff1a;https://github.com/BBuf/how-to-optim-algorithm-in-cuda/tree/master/large-language-model-note &#xff0c;从2023年3月左右到现…

编写程序,要求输入x的值,输出y的值。分别用(1)不嵌套的if语句(2)嵌套的if语句(3)if-else语句(4)switch语句。

编写程序&#xff0c;要求输入x的值&#xff0c;输出y的值。分别用&#xff08;1&#xff09;不嵌套的if语句&#xff08;2&#xff09;嵌套的if语句&#xff08;3&#xff09;if-else语句&#xff08;4&#xff09;switch语句。 选择结构是编程语言中常用的一种控制结构&…

OpenGL 的学习之路-4(变换)

三大变换&#xff1a;平移、缩放、旋转&#xff08;通过这三种变换&#xff0c;可以将图像移动到任意位置&#xff09; 其实&#xff0c;这背后对应的数学在 闫令琪 图形学课程 中有过一些了解&#xff0c;所以&#xff0c;理解起来也不觉得很困难。看程序吧。 1.画三角形&am…

量化交易:公司基本面的量化

公司的基本面因素一直具备滞后性&#xff0c;令基本面的量化出现巨大困难。而从上市公司的基本面因素来看&#xff0c;一般只有每个季度的公布期才会有财务指标的更新&#xff0c;而这种财务指标的滞后性对股票表现是否有影响呢&#xff1f;如何去规避基本面滞后产生的风险呢&a…

网站SEO优化

网站SEO优化 浏览722 一、合理的title、description、keywords 搜索对着三项的权重逐个减小&#xff0c;title值强调重点即可&#xff1b;description把页面内容高度概括&#xff0c;不可过分堆砌关键词&#xff1b;keywords列举出重要关键词。 1、title title&#xff0c;…

【教3妹学编程-java基础6】详解父子类变量、代码块、构造函数执行顺序

-----------------第二天------------------------ 本文先论述父子类变量、代码块、构造函数执行顺序的结论&#xff0c; 然后通过举例论证&#xff0c;接着再扩展&#xff0c;彻底搞懂静态代码块、动态代码块、构造函数、父子类、类加载机制等知识体系。 温故而知新&#xff…

ZYNQ_project:LCD

模块框图&#xff1a; 时序图&#xff1a; 代码&#xff1a; /* // 24h000000 4324 9Mhz 480*272 // 24h800000 7084 33Mhz 800*480 // 24h008080 7016 50Mhz 1024*600 // 24h000080 4384 33Mhz 800*480 // 24h800080 1018 70Mhz 1280*800 */ module rd_id(i…

【MySQL】InnoDB和MyISAM区别详解(MySQL专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

OpenCV C++ 图像 批处理 (批量调整尺寸、批量重命名)

文章目录 图像 批处理(调整尺寸、重命名)图像 批处理(调整尺寸、重命名) 拿着棋盘格,对着相机变换不同的方角度,采集十张以上(以10~20张为宜);或者棋盘格放到桌上,拿着相机从不同角度一通拍摄。 以棋盘格,第一个内焦点为坐标原点,便于计算世界坐标系下三维坐标; …

【代码随想录】算法训练计划24

回溯模板&#xff1a; 1、77. 组合 题目&#xff1a; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 思路&#xff1a; 很经典的回溯&#xff0c;也是回溯中模板的经典应用&#xff0c;因而是回溯中的简单题…

97.qt qml-自定义Table之实现ctrl与shift多选

我们之前实现了:93.qt qml-自定义Table优化(新增:水平拖拽/缩放自适应/选择使能/自定义委托)-CSDN博客 实现选择使能的时候,我们只能一行行去点击选中,非常麻烦,所以本章我们实现ctrl多选与shift多选、 所以在Table控件新增两个属性: 1.实现介绍 ctrl多选实现原理:当我…

Redis新操作

1.Bitmaps 1.1概述 Bitmaps可以对位进行操作&#xff0c;实际上它就是一个字符串&#xff0c;可以将Bitmaps想象为一个以位为单位的数组&#xff0c;数组中的每个元素只能存储0或者1&#xff0c;数组的下标在Bitmaps被称为偏移量。 setbit key offset value&#xff1a;设置o…

Filter和ThreadLocal结合存储用户id信息

ThreadLocal并不是一个Thread&#xff0c;而是Thread的局部变量。当使用ThreadLocal维护变量时&#xff0c;ThreadLocal为每个使用该变量的线程提供独立的变量副本&#xff0c;所以每一个线程都可以独立地改变自己的副本&#xff0c;而不会影响其它线程所对应的副本。ThreadLoc…

M2 Mac Xcode编译报错 ‘***.framework/‘ for architecture arm64

In /Users/fly/Project/Pods/YYKit/Vendor/WebP.framework/WebP(anim_decode.o), building for iOS Simulator, but linking in object file built for iOS, file /Users/fly/Project/Pods/YYKit/Vendor/WebP.framework/WebP for architecture arm64 这是我当时编译模拟器时报…
最新文章