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

news2025/1/19 11:24:06

本文主要介绍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.coloradmin.cn/o/1224707.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言之for while语句详解

C语言之for while语句详解 文章目录 C语言之for while语句详解简介1 while语句1.1while语句的格式1.2 while语句的实践 2 for2.1 for语句格式2.2 for循环的实践 3 do while3.1 do while语句格式3.2 do while循环的实践 3 循环中break和continue3.1 while语句中的break和continu…

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 这是我当时编译模拟器时报…

java并发编程JUC:一、专栏配置+进程与线程+并行和并发+同步和异步+线程的创建、调用、查看、运行原理和相关API

专栏配置 pom.xml <properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies><dependency><groupId>org.projectlombok<…

柯桥会计培训|中级会计职称,考过中级,可以从事哪些工作?

拿下中级会计证书后&#xff0c;可以从事哪些工作呢&#xff1f;一起来看看吧~ 财务经理 财务经理可以说是会计人梦寐以求的岗位&#xff0c;上可以和老板畅聊公司财务情况&#xff0c;下可以管理整个财务部。但是在财务管理水平日益成为企业核心竞争力的今天&#xff0c;企业…

NSSCTF第13页(1)

[NCTF 2018]Easy_Audit 小小代码审计 $_REQUEST:PHP的内置变量&#xff0c;是一个数组&#xff0c;保存传递的参数&#xff0c;它的特性是如果get,post一起传参&#xff0c;则会优先post传参&#xff0c;可以由此进行变量覆盖。 $_SERVER:PHP的内置变量&#xff0c;是一个数组…

kubenetes-pod高可用

一、概述 实现pod层面的高可用&#xff0c;需要避免容器进程被终止避免Pod被驱逐&#xff1a; 设置合理的resources.memory limits 防止容器进程被 OOMKill&#xff0c;防止Pod被驱逐&#xff1b;设置合理的emptydir.sizeLimit 并且确保数据写入不超过emptyDir的限制&#xf…

【C++】chono库:使用及源码分析

文章目录 0. 概述1. duration1.1 分析std::chrono::duration_cast() 1.2 使用案例std::chrono::duration::count() 1.3 部分源码 2. time_point2.1 分析std::chrono::time_point_cast() 2.2 使用举例std::chrono::time_point::time_since_epoch() 2.3 部分源码 0. 概述 本篇文…

【数据结构】栈与队列面试题(C语言)

我们再用C语言做题时&#xff0c;是比较不方便的&#xff0c;因此我们在用到数据结构中的某些时只能手搓或者Ctrlcv 我们这里用到的栈或队列来自栈与队列的实现 有效的括号 有效的括号&#xff0c;链接奉上。 解题思路&#xff1a; 先说结论&#xff1a; 因为我们是在讲栈与…

mac系统安装docker desktop

Docker的基本概念 Docker 包括三个基本概念: 镜像&#xff08;Image&#xff09;&#xff1a;相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。比如说nginx,mysql,redis等软件可以做成一个镜像。容器&#…

C++知识点总结(6):高精度乘法

一、高精度数 低精度数 1. 输入两个数字 char a_str[1005] {}; long long b; cin >> a_str >> b; 2. 将高精度数转换为整型 int a[1005] {}; int len_a strlen(a_str); for (int i 0; i < len_a-1; i) {a[len_a-i-1] a_str[i] - 48; } 3. 计算 int …

java Could not resolve placeholder

1、参考&#xff1a;https://blog.csdn.net/yu1812531/article/details/123466616 2、配置文件: 3、在application.properties中设置要使用的配置文件

APIcloud 【现已更名 用友开发中心】 iOS发版 应用程序请求用户同意访问相机和照片,但没有在目的字符串中充分说明相机和照片的使用。

iOS 审核时 提示 首次安装软件 获取相机 相册 提示信息 怎么修改 我们注意到你的应用程序请求用户同意访问相机和照片&#xff0c;但没有在目的字符串中充分说明相机和照片的使用。 为了解决这个问题&#xff0c;修改应用信息中的目的字符串是合适的。相机和照片的Plist文件&a…

【giszz笔记】产品设计标准流程【6】

目录 六、组织评审 1.评审的类型 2.评审的人员——谁参加评审 3.评审的核心——怎么提问 & 答案谁说了算 4.评审的流程——前中后三部曲 5.评审的标的——漂亮的靶子 6.避免被“烤”问的一些技巧 7.搞几次评审比较好 这个产品设计系列&#xff0c;陆陆续续写了6篇了…

【DevOps】Git 图文详解(三):常用的 Git GUI

Git 图文详解&#xff08;三&#xff09;&#xff1a;常用的 Git GUI 1.SourceTree2.TortoiseGit3.VSCode 中的 Git 如果不想用命令行工具&#xff0c;完全可以安装一个 Git 的 GUI 工具&#xff0c;用的更简单、更舒服。不用记那么多命令了&#xff0c;极易上手&#xff0c;不…

C++初阶 日期类的实现(下)

目录 一、输入输出(>>,<<)重载的实现 1.1初始版 1.2友元并修改 1.2.1简单介绍下友元 1.2.2修改 1.3>>重载 二、条件判断操作符的实现 2.1操作符的实现 2.2!操作符的实现 2.3>操作符的实现 2.4>,<,<操作符的实现 三、日期-日期的实现 …

深入理解网络协议:通信世界的基石

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在当今数字化时代&#xff0c;网络协议是连接世…

Intellij Idea屏蔽日志/过滤日志

一、安装插件 Grep Console 二、设置关键词&#xff0c;过滤日志 关键词的前后加上 .* 符号&#xff0c;类似&#xff1a; .*关键词.*设置后 &#xff0c;点击 Apply 即可过滤日志。

上网行为审计软件能审计到什么

上网行为审计软件是一种用于监控和分析员工在工作时间使用互联网行为的软件工具。这种软件可以帮助企业管理员工在工作时间内的互联网使用情况&#xff0c;以确保员工的行为符合企业规定和法律法规。 域之盾软件---上网行为审计软件可以审计到以下内容&#xff1a; 1、网络访问…

FFmpeg 6.1 发布,7.0时代即将来临

11月10日&#xff0c;FFmpeg 6.1正式发布。 FFmpeg 发布版本的时候&#xff0c;按照惯例&#xff0c;会选择一些物理学家名字作为代号&#xff0c;这一新版本代号为“Heaviside”。主要为纪念伟大的英国数学家和物理学家奥利弗黑维塞&#xff08;Oliver Heaviside)。 奥利弗黑维…

Vulhub靶场-KIOPTRIX: LEVEL 1

目录 环境配置 端口扫描 漏洞发现 mod_ssl漏洞利用 Samba远程代码执行漏洞利用 环境配置 首先去官网下载靶场导入到虚拟机中 下载地址&#xff1a;Kioptrix: Level 1 (#1) ~ VulnHub 下载完成之后导入到vmware中 这里需要改nat&#xff0c;桥接模式的靶机拿不到IP&…