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 32stp	x29, x30, [sp, #16]             ; 16-byte Folded Spilladd	x29, sp, #16.cfi_def_cfa w29, 16.cfi_offset w30, -8.cfi_offset w29, -16mov	w8, #0str	w8, [sp, #8]                    ; 4-byte Folded Spillstur	wzr, [x29, #-4]adrp	x0, l_.str@PAGEadd	x0, x0, l_.str@PAGEOFFbl	_printfldr	w0, [sp, #8]                    ; 4-byte Folded Reloadldp	x29, x30, [sp, #16]             ; 16-byte Folded Reloadadd	sp, sp, #32ret.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.rhkb.cn/news/196812.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【智能家居项目】FreeRTOS版本——多任务系统中使用DHT11 | 获取SNTP服务器时间 | 重新设计功能框架

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《智能家居项目》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f353;多任务系统中使用DHT11&#x1f345;关闭调度器&#x1f345;使用中断 &am…

探索NLP中的核心架构:编码器与解码器的区别

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

jsp中使用PDF.js实现pdf文件的预览

本文介绍的是在使用jsp作为模板引擎的spring-mvc项目中&#xff0c;如何利用 PDF.js实现pdf文件的预览。 1、下载 PDF.js Getting Started (mozilla.github.io) 下载解压后其中有两个目录&#xff0c;直接将这两个文件夹放到项目的web资源目录中。此时相当于把PDF.js这个项目也…

2019年五一杯数学建模B题木板最优切割方案解题全过程文档及程序

2019年五一杯数学建模 B题 木板最优切割方案 原题再现 徐州某家具厂新进一批木板如表 1 所示&#xff0c;在家具加工的过程中&#xff0c;需要使用切割工具生产表 2所示的产品。假设&#xff1a;木板厚度和割缝宽度忽略不计。   请为该家具厂给出如下问题的木板最优切割方…

掌握Shell:从新手到编程大师的Linux之旅

1 shell介绍 1.1 shell脚本的意义 1.记录命令执行的过程和执行逻辑&#xff0c;以便以后重复执行 2.脚本可以批量处理主机 3.脚本可以定时处理主机 1.2 脚本的创建 #!/bin/bash # 运行脚本时候执行的环境1.3 自动添加脚本说明信息 /etc/vimrc # vim主配置文件 ~/.vimrc # 该…

生成对抗网络Generative Adversarial Network,GAN

Basic Idea of GAN Generation&#xff08;生成器&#xff09;  Generation是一个neural network&#xff0c;它的输入是一个vector&#xff0c;它的输出是一个更高维的vector&#xff0c;以图片生成为例&#xff0c;输出就是一张图片&#xff0c;其中每个维度的值代表生…

【数据结构】图的存储结构(邻接矩阵)

一.邻接矩阵 1.图的特点 任何两个顶点之间都可能存在边&#xff0c;无法通过存储位置表示这种任意的逻辑关系。 图无法采用顺序存储结构。 2.如何存储图&#xff1f; 将顶点与边分开存储。 3.邻接矩阵&#xff08;数组表示法&#xff09; 基本思想&#xff1a; 用一个一维数…

C#特性(Attribute)

C#特性&#xff08;Attribute&#xff09;是一种在程序中添加元数据的机制&#xff0c;它可以为代码提供额外的信息和指示。通过使用特性&#xff0c;我们可以为类、方法、属性等元素添加标记&#xff0c;以便在运行时进行更多的操作和决策。 C#特性是一种声明式编程的工具&…

解决 uniapp 开发微信小程序 不能使用本地图片作为背景图 问题

参考博文&#xff1a;uniapp微信小程序无法使用本地静态资源图片(背景图在真机不显示)的解决方法_javascript技巧_脚本之家 问题&#xff1a;uniapp 开发微信小程序&#xff0c;当使用本地图片作为 background-image 时&#xff0c;真机无法显示 解决&#xff1a; 方法一&am…

Redis新操作

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

32位单片机PY32F040,主频72M,外设丰富,支持断码LCD

PY32F040 系列微控制器采用高性能的 32 位 ARM Cortex-M0 内核,宽电压工作范围的 MCU。嵌入高达 128 Kbytes flash 和 16 Kbytes SRAM 存储器,最高工作频率 72 MHz。LQFP64封装两块出头就可以拿到&#xff0c;我们还有开发板和开发资料帮助客户更好的开发。 PY32F040 系列微控…

一起Talk Android吧(第五百五十三回:解析Retrofit返回的数据)

文章目录 1. 知识回顾2. 解析方法2.1 解析有效数据2.2 解析错误数据3. 示例代码4. 经验与总结4.1 经验分享4.2 内容总结各位看官们大家好,上一回中咱们说的例子是"Retrofit的基本用法",本章回中介绍的例子是" 如何解析Retrofit返回的数据"。闲话休提,言…

【AI视野·今日Robot 机器人论文速览 第六十三期】Thu, 26 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Fri, 27 Oct 2023 Totally 27 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers 6-DoF Stability Field via Diffusion Models Authors Takuma Yoneda, Tianchong Jiang, Gregory Shakhnarovich, Matthew R. …

Windows安装nvm【node.js版本管理工具】

目录 下载安装包 安装 配置 配置node的国内镜像源 配置npm的国内镜像源 常用命令 查看可安装的node版本 安装指定的版本 查看已有的node版本列表 切换版本 下载安装包 https://github.com/coreybutler/nvm-windows/releases/tag/1.1.11 安装 安装过程就不贴了&#xff0…

单元测试,集成测试,系统测试的区别是什么?

实际的测试工作当中&#xff0c;我们会从不同的角度对软件测试的活动进行分类&#xff0c;题主说的“单元测试&#xff0c;集成测试&#xff0c;系统测试”&#xff0c;是按照开发阶段进行测试活动的划分。这种划分完整的分类&#xff0c;其实是分为四种“单元测试&#xff0c;…

2023最新最全【OpenMV】 入门教程

1. 什么是OpenMV OpenMV 是一个开源&#xff0c;低成本&#xff0c;功能强大的 机器视觉模块。 OpenMV上的机器视觉算法包括 寻找色块、人脸检测、眼球跟踪、边缘检测、标志跟踪 等。 以STM32F427CPU为核心&#xff0c;集成了OV7725摄像头芯片&#xff0c;在小巧的硬件模块上&a…

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

2.2 调用星火大模型的API

调用星火大模型的API 1 申请API调用权限&#xff1a;2 调用原生星火 API3 统一API调用方式 项目仓库地址&#xff1a;https://github.com/datawhalechina/llm-universe 讯飞星火认知大模型&#xff0c;由科大讯飞于2023年5月推出的中文大模型&#xff0c;也是国内大模型的代表…

2.3 调用智谱 API

调用智谱 API 1 申请调用权限2 调用智谱 AI API3 使用 LangChain 调用智谱 AI参考&#xff1a; 智谱 AI 是由清华大学计算机系技术成果转化而来的公司&#xff0c;致力于打造新一代认知智能通用模型。公司合作研发了双语千亿级超大规模预训练模型 GLM-130B&#xff0c;并构建了…

PostgreSQL基于Citus实现的分布式集群

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…