gcc编译与Linux下的库

gcc与g++编译

  1. GCC:GCC是一个由GNU项目开发的多平台编译器,最初是为C语言设计的编译器,但随着时间的发展,它已经扩展到支持多种编程语言。它支持多种编程语言,包括C、C++、Objective-C、Fortran、Ada和Go等。GCC是自由软件,遵循GNU通用公共许可证(GPL)发布。

  2. G++是GCC的一个部分,专门用于编译C++程序。G++实际上是GCC的一个前端,它使用相同的后端来生成机器代码。在很多系统中,g++ 命令实际上是一个指向 gcc 的符号链接,但它们在处理C++特有的特性时会有所不同。

  3. GNU:是“GNU's Not Unix”的缩写,是一个由理查德·斯托曼(Richard Stallman)发起的自由软件项目,旨在创建一个完全自由的操作系统,包括操作系统的所有组件。GNU项目开发了许多重要的自由软件,如GCC、Emacs编辑器、Bash shell、GDB调试器等。

GCC和G++都是GNU项目的一部分,它们是GNU工具链中的核心组件,用于编译和链接程序。GNU工具链还包括其他工具,如链接器(ld)、库(如glibc)、调试器(如GDB)等,这些都是构建和运行程序所必需的。

  • 预处理:

编译器对各种预处理命令进行处理,包括对头文件的包含、宏定义的扩展、条件编译的选择。(总结的将就是对#语句的扩展处理)。

//现有文件test.c
//在命令行下输入gcc预处理命令
gcc -E test.c -o test.i

选项“-E”告诉gcc只进行预处理;“test.c”为C源程序文件;“-o”用于指定要生成的结果文件,后面跟的就是结果文件名字;这里输出的预处理结果文件为test.i。

  • 编译

编译器对高级语言源程序进行语法分析、词法分析和语义分析,然后根据分析的结果进行代码优化和存储分配,最终把高级语言程序翻译成汇编语言程序。

gcc对源程序文件编译后生成的汇编文件是.s文件。我们可对上边的 test.i进行编译:

gcc -S test.i -o test.s

也可以直接对c源程序文件进行编译:

gcc -S test.c -o test.s

选项“-S”告诉只进行到编译阶段。

  • 汇编

将编译生成的汇编语言程序转换为机器语言程序。
因为通常最终生成的可执行目标文件是由多个不同模块对应的机器语言目标代码组合而形成,所以,在生成单个模块的机器语言代码是,不可能确定每一条指令或数据最终的地址,即单个模块的机器语言目标代码需要重定位,因此把汇编生成的机器语言目标代码文件称为可重定位目标文件。

gcc生成的二进制代码文件(可重定位目标文件)为后缀名为.o的文件。我们对上边的test.s进行汇编

gcc -c test.s -o test.o

也可以直接对c源程序文件进行汇编:

gcc -c test.c -o test.o

选项“-c”告诉只进行到汇编阶段。

  • 链接

将一个程序的所有关联模块对应的可重定位目标文件结合在一起,以形成一个可执行文件的过程称为链接。在早期的计算机系统中,链接是手动完成的,而现在则由专门的链接程序(链接器)来实现。

需要知道的是:可重定位目标文件和可执行目标文件都是机器语言目标文件,都是不可显示的二进制文件,所不同的是前者是由单个模块生成的,而后者是多个模块生成的。因而,对前街,代码地址总是从0开始,而对于后者,代码在操作系统规定的虚拟地址空间中产生。

对上边生成的可重定位目标文件test.o进行链接:

gcc test.o -o test

这里只有一个可重定位目标文件, 如果有多个可重定位目标文件(.o文件)可以写在一起,每两个目标文件之间加空格,例如

gcc test1.o test2.o test3.o -o test

运行后,生成可执行文件test,我们可以运行它:

./test

gcc常见选项

gcc语法格式:

gcc [选项] 准备编译的文件 [选项] [目标文件]
  • -o:用于指定要生成的结果文件,后边跟的就是结果文件名字。
  • -I(i的大写):用来指定头文件所在文件夹的路径,用法为 -I dirPath。
  • -wall:显示所用的警告信息(Warn all)。
  • -g:产生供gdb调试用的可执行文件。
  • -l:链接共享库。

在实际的软件开发中,对于一些需要被许多模块反复使用的公共代码,我们通常可以将他们编译为库文件。库从本质上说是一种可执行代码的二进制格式,可以被载入内存中执行。

静态库(Static Library)

  1. 定义:静态库是一组编译后的代码和资源的集合,它们在编译时被直接链接到最终的可执行文件中。

  2. 文件扩展名:通常为.a(在Unix-like系统中)或.lib(在Windows系统中)。

  3. 编译过程在编译时,静态库的内容被复制到最终的可执行文件中,这意味着可执行文件包含了所有需要的代码和资源。

  4. 优点

    • 因为库代码已经包含在可执行文件中,所以不需要在运行时额外加载库文件。

    • 减少了运行时的依赖,因为所有需要的代码都已经包含在内。

    • 可能提高程序的启动速度,因为加载的是单个文件。

  5. 缺点

    • 增加了可执行文件的大小,因为包含了库的代码。

    • 如果库更新,需要重新编译整个程序来更新这部分代码。

    • 多个程序使用同一个静态库的不同版本可能会导致内存浪费。

        4、配合静态库写一个头文件,文件里的内容就是提供给外边使用的函数、变 量或类的声明。

静态库与源码编译:

gcc test.c -o test -l库名 -L 指定库文件 -I 头文件地址

动态库(Dynamic Library)

  1. 定义:动态库在程序运行时被加载,而不是在编译时。它们在内存中只存在一份,可以被多个程序共享。

  2. 文件扩展名:通常为.so(在Unix-like系统中,如Linux),.dll(在Windows系统中)或.dylib(在macOS系统中)。

  3. 编译过程在编译时,程序只记录了动态库的位置和需要的函数接口,实际的代码在运行时才被加载。

  4. 优点

    • 减少了可执行文件的大小,因为不包含库的代码。

    • 库的更新不需要重新编译程序,只需替换或更新动态库文件。

    • 多个程序可以共享同一份库,节省内存和存储空间。

  5. 缺点

    • 程序启动可能稍慢,因为需要在运行时加载库。

    • 需要确保动态库在运行时可用,否则程序可能无法启动或运行不正常。

    • 动态库的版本管理可能更复杂。

解决方式原理:把动态库放在默认的搜索路径上或者告诉系统动态库的路径即可。

选择使用静态库还是动态库

选择使用静态库还是动态库通常取决于应用程序的需求、部署环境和库的更新频率。例如,对于需要快速启动且不经常更新的小型应用程序,静态库可能是更好的选择。而对于大型应用程序或库更新频繁的情况,动态库可能更合适,因为它允许更灵活的更新和共享。+

注:

针对程序的具体的编译执行过程以及静态库、动态库,可参考袁春风的《计算机系统基础》中第4章:程序的链接。

gcc具体的Linux操作命令可参考(朱文伟 李建英) 的《Linux c与c++一线开发实践 》中第2章第八节:gcc编译和第10章:linux下的库

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

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

相关文章

【路径规划】在MATLAB中使用粒子群优化(PSO)进行最优移动机器人路径规划

摘要 本文介绍了使用粒子群优化(Particle Swarm Optimization, PSO)算法实现移动机器人的路径规划。PSO是一种基于群体智能的优化算法,通过模拟粒子群体在搜索空间中的迭代更新,找到全局最优路径。本文通过MATLAB仿真展示了PSO在…

惠中科技RDS自清洁膜层:光伏领域的绿色革命

惠中科技RDS自清洁膜层:光伏领域的绿色革命 在全球能源转型和光伏产业蓬勃发展的背景下,光伏电站的运营维护面临着诸多挑战,其中灰尘污染问题尤为突出。灰尘的堆积不仅降低了光伏板的透光率,还直接影响了电站的发电效率和经济效益…

【深度学习与NLP】——词嵌入Embedding技术

目录 1.词嵌入的作用 2.嵌入矩阵的计算 3.Embedding层的代码实验 词嵌入(Embedding)技术是一种将词汇映射到低维连续向量空间的方法。将离散的单词数据处理成连续且固定长度的向量,使模型可以学习和处理语义信息。 假设需要将["Are&…

数组和指针 笔试题(3)

目录 11.笔试题11 12.笔试题12 13.笔试题13 14.笔试题14 11.笔试题11 //笔试题11(难)int a[5][5];//创建25个int类//p[]1[]2[]3[]4[]5 []6[]7[]8[]9[]10 []11[]12[]13[]14[]15 []16(p[4])[][](p[4][2])[][] [][]&a…

小型防爆气象站是什么

在易燃易爆、危险系数高的工业环境中,小型防爆气象站犹如一位忠诚的安全守护者,默默守护着生产现场和人员的安全。它以其独特的防爆特性、精准的监测能力以及智能化的管理手段,成为了这些环境中不可或缺的安全屏障。 小型防爆气象站的核心优势…

量化交易面试:什么是Black-Scholes方程?

Black-Scholes方程是金融数学中的一个重要方程,用于计算欧式期权的理论价格。它由Fischer Black、Myron Scholes和Robert Merton在1970年代提出,并为他们赢得了诺贝尔经济学奖。以下是对Black-Scholes方程的详细解释: 基本概念: …

[数据集][目标检测]鲜花检测数据集VOC+YOLO格式25215张106类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):25215 标注数量(xml文件个数):25215 标注数量(txt文件个数):25215 标…

初试构建工具Webpack

文章目录 一、Webpack概述二、安装Webpack三、Webpack打包实战1、创建index.js2、创建index.html3、运行webpack4、浏览index.html5、添加第二个脚本(1)创建index2.js(2)修改index.js(3)重新运行 webpack&a…

AtomicIntegerArray使用、核心源码解析

1、API方法使用 构造方法 AtomicIntegerArray atomicIntegerArray1 new AtomicIntegerArray(100); 源码: private final int[] array; public AtomicIntegerArray(int var1) {this.array new int[var1]; }int[] array {10, 20, 30, 0, 0}; AtomicIntegerArray arr new At…

伦理学(Ethics)

讯飞星火 伦理学哲学是一门关于道德问题的科学,旨在系统化和理论化道德思想观点。作为一门独立的哲学分支学科,伦理学的本质是对道德现象进行研究,包括道德意识、道德行为以及道德规范现象等。 伦理学的研究对象广泛,涉及个人的…

驱动(RK3588S)第六课时:linux2.6的使用与GPIO子系统的使用

目录 一、Linux2.6 字符设备驱动编写框架1、合成一个完整的设备号函数2、从完整的设备号里提取主设备号3、动态申请设备号4、静态申请设备号5、释放申请的设备号6、Linux2.6 字符设备驱动的核心结构体7、初始化核心结构体8、向内核去申请 linux2.6 字符设备9、释放申请的设备10…

哈希 详解

目录 1. “哈希”是什么? 2. 哈希冲突 3. 哈希函数 3.1 设计原则 3.2 常见哈希函数 4. 解决哈希冲突的两种常见方法 4.1 闭散列 4.2 开散列 4.3 散列表的扩容问题 5. 哈希表的实现 并 封装模拟实现unordered系列容器 6. 哈希的应用 6.1 位图 -- bitset …

【js逆向专题】2.浏览器调试技巧

小节目标: 熟悉 开发者工具的使用熟悉 代码断点的方式熟悉 网页debugger实现方式 一. 浏览器开发者工具 1. element元素面板 展示浏览器渲染之后的页面 2. network网络面板 浏览器请求的数据都会加载在网络面板 3. console控制台面板 可以在控制台调试你对应的代码 4.…

3000字带你了解SD提示词用法,一点就通,小白轻松上手(附提示词生成器)(1.4 SD提示词运用)

提示词是什么 提示词是我们向AI模型发出的指令。正确的提示词能让AI准确反馈所需的输出,而优质的提示词则能使AI生成的内容更优质、更符合你的期望。这与编写程序代码颇为相似,准确的代码逻辑是程序正常运行的前提,而优秀的代码则能减少运行…

Vue基础概述

Vue框架概述 什么是Vue框架 Vue是一种流行的渐进式JavaScript框架,用于构建Web用户界面。它具有易学、轻量级、灵活性强、高效率等特点,并且可以与其他库和项目集成。是目前最流行的前端框架之一.框架的两种用法: 多页面应用: 在html页面中引入vue.js框…

全倒装共阴节能COB超微小间距LED显示屏主导新型显示技术

COB(Chip on Board)技术最早发源于上世纪60年代,是将LED芯片直接封装在PCB电路板上,并用特种树脂做整体覆盖。COB实现“点” 光源到“面” 光源的转换。点间距有P0.3、P0.4、P0.5、P0.6、P0.7、P0.9、P1.25、P1.538、P1.5625、P1.…

NanoPC-T6安装redriod笔记

这里主要用于自己对安装过程的记录,中间可能记录比较粗糙。 重新编译内核 参考链接:【环境搭建】基于linux的NanoPC-T6_LTS系统固件编译环境搭建 基于docker构建编译环境 docker run -it \ --privilegedtrue --cap-addALL \ --name nanopc_t6_lts_en…

ESP32!Thonny+MicroPython+ESP32开发环境搭建!!

准备工具: ThonnyMicroPythonESP32 一.Thonny安装 下载地址:Thonny, Python IDE for beginnershttps://thonny.org/ 二.下载esp32环境——根据型号下载 下载地址:MicroPython - Python for microcontrollershttps://micropython.org/dow…

Spring Boot 多数据源配置(JPA)

目录 前言 前置环境 pom yml Entity Dao Config Controller 演示 前言 一般一个系统至少有一个数据源,用来持久化业务数据以及查询。单个数据源的系统很常见,在 Spring Boot 框架下配置也很简单。在约定大于配置这个思想下,只需要在…

vue 中计算属性可以接收参数

代码中的value就是接收的参数 计算属性要接收参数要写在返回的时候 computed: {isButtonDisabled() {return (value) > {const num parseInt(value);return isNaN(num) || num < 0}},},//计算属性aaa(){return (value) >{写逻辑return 返回值}} 使用 <el-butto…