gcc编译与Linux下的库

news2024/9/21 14:39:54

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”告诉只进行到汇编阶段。

  • 链接

对上边生成的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章:程序的链接 与第5章:程序的执行。

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

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

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

相关文章

linux文件的拓展属性

一、概述 文件的扩展属性(EA) 即以名称-值对形式将任意元数据与文件 i 节点关联 起来的技术。 2. EA 可用于实现访问列表(第 17 章)和文件能力(第 39 章)。 二、EA 命名空间 EA 的命名格式为 namespace…

C++重载实现Mystring

#include<iostream> #include<cstring> //可以使用string类 #include<string> //#include <string.h>using namespace std;class Mystring {public:Mystring():str(nullptr), len(0){}Mystring(const char *const str1){if (str1){len s…

Datawhale X 李宏毅苹果书AI夏令营 学习笔记

学习日志 日期&#xff1a; 2024年9月3日 今日学习内容&#xff1a; 今天&#xff0c;我深入学习了深度学习中的几种重要概念&#xff0c;包括优化算法、特征归一化、以及批量归一化的原理和应用。这次学习的内容涵盖了从基础的梯度下降法到更高级的优化技术&#xff0c;同时…

【Linux系统编程】TCP实现--socket

使用套接字socket实现服务器和客户端之间的TCP通信。 流程如下&#xff1a; 实现代码&#xff1a; /* server.c */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <arpa/inet.h> #include <s…

分类预测|基于麻雀优化正则化极限学习机的数据分类预测Matlab程序SSA-RELM 多特征输入多类别输出

分类预测|基于麻雀优化正则化极限学习机的数据分类预测Matlab程序SSA-RELM 多特征输入多类别输出 文章目录 一、基本原理1. 数据准备2. RELM模型建立3. SSA优化RELM参数4. 模型训练5. 模型评估6. 结果分析与应用原理总结 二、实验结果三、核心代码四、代码获取五、总结 分类预测…

在Ubuntu上运行QtCreator相关程序

背景&#xff1a;希望尝试在Linux系统上跑一下使用QtCreator相关的程序&#xff0c;因为有一些工作岗位要求有Linux上使用Qt的经验。 (1)我是把Windows上的程序移过来的&#xff0c;Windows上文件名称是不区分大小写的。 而Ubuntu上是区分的 所以一部分头文件需要进行修改&am…

大数据Flink(一百一十二):Flink SQL作业快速入门

文章目录 Flink SQL作业快速入门 一、进入Flink开发平台 二、​​​​​​​创建作业 三、​​​​​​​​​​​​​​编写作业代码 四、​​​​​​​​​​​​​​进行更多配置 五、​​​​​​​​​​​​​​进行深度检查 六、​​​​​​​​​​​​​​进…

AWS SES服务 Golang接入教程(排坑版)

因为刚来看的时候 也迷迷糊糊的 所以 先讲概念 再上代码 一 基础设置 这里需要完成两个最基础的设置任务 1 是验证至少一个收件电子邮箱 2 【很关键】是验证发送域。即身份里的域类型的身份。&#xff08;可以理解为配置你的域名邮箱服务器&#xff08;SMPT&#xff09;为亚马…

PMP–一、二、三模、冲刺、必刷–分类–14.敏捷–技巧--累积流图

文章目录 技巧一模二模三模14.敏捷–敏捷团队的衡量结果–累积流图&#xff1a;1、 敏捷项目的项目经理担心团队在最近的迭代中失去了动力。项目经理应该使用哪两种工具来分析团队绩效&#xff1f;&#xff08;选择两个&#xff09; 冲刺必刷7.成本管理--挣值分析燃尽图仅能了解…

Trm理论 3(ELMo)

LSTM模型 如图&#xff0c;LSTM模型是rnn模型的改良版&#xff0c;通过ft来选择性的保留上一次得到的信息 ELMo模型&#xff08;双向LSTM&#xff09; ELMo模型是对word2vec的改良&#xff0c;改良了word2vec的二义性 对比上下两图&#xff0c;可以发现&#xff0c;WE对预测…

基于约束大于规范的想法,封装缓存组件

架构&#xff1f;何谓架构&#xff1f;好像并没有一个准确的概念。以前我觉得架构就是搭出一套完美的框架&#xff0c;可以让其他开发人员减少不必要的代码开发量&#xff1b;可以完美地实现高内聚低耦合的准则;可以尽可能地实现用最少的硬件资源&#xff0c;实现最高的程序效率…

Linux文件【系统调用接口及进程中对打开文件的管理操作】详细讲解

目录 一、open函数 1.介绍 2.open函数返回值 二、重定向 1.文件描述符的分配规则 2.重定向的本质 3.dup2系统调用 三、C语言库函数中的缓冲区及不同刷新模式 前言&#xff1a; 我们先来简单回顾一下C语言中的文件相关知识 ● 打开文件的方式 r …

数图亮相第三届中国区域零售创新峰会:共绘零售新蓝图,携手迈向新征程

8月31日&#xff0c;备受瞩目的第三届中国区域零售创新峰会在历史悠久的湖北襄阳圆满落下帷幕。在这场零售行业的盛会上&#xff0c;数图信息科技作为重要参会企业&#xff0c;积极参与其中&#xff0c;与众多行业精英共聚一堂&#xff0c;共同擘画零售业的宏伟蓝图。以下是本次…

C程序设计——指针杂谈0

变量和常量讲的差不多了&#xff0c;这里先把指针再深入理解一下&#xff0c;如果你是C语言初学者&#xff0c;本节可能看不太懂&#xff0c;没关系可以以后再看。 变量 当定义变量的时候&#xff0c;本质是在内存中分配了一段空间&#xff0c;这段空间的大小与变量的类型相关…

GD - EmbeddedBuilder - 给已有工程换MCU

文章目录 GD - EmbeddedBuilder - 给已有工程换MCU概述不行的重现 笔记工程的.gdc文件内容中有MCU型号可以改 给已有工程换MCU的使用场景END GD - EmbeddedBuilder - 给已有工程换MCU 概述 一个现存的EmbeddedBuilder的工程&#xff0c;想换个MCU配置做实验&#xff0c;又不想…

极盾故事|某金融租赁机构应用数据保护新策略:“动态脱敏”“二次授权”

数据的流通使用是创新的动力&#xff0c;但安全和合规是不可逾越的底线。企业如何在这三者之间找到平衡点&#xff1f; 极盾科技&#xff0c;助力某金融租赁机构&#xff0c;基于极盾觅踪构建应用数据动态脱敏系统&#xff0c;实现10&#xff0b;核心应用系统的统一管理&#x…

库(Library)

库的定义 在Linux操作系统中&#xff0c;库&#xff08;Library&#xff09;是一段编译好的、可重用的代码&#xff0c;它能够被其他程序或应用程序在运行时调用。库可以提高代码的模块化&#xff0c;使得开发者可以共享和重用代码&#xff0c;从而提高开发效率&#xff0c;减少…

如何在 Ubuntu 24.04 上安装 MariaDB ?

MariaDB 是一个流行的开源关系数据库管理系统&#xff0c;它是 MySQL 的一个分支&#xff0c;它被广泛用于存储和管理数据。本指南将引导您完成在 Ubuntu 24.04 上安装 MariaDB 的步骤。 Step 1: Update Your System 首先更新系统&#xff0c;确保所有的软件都是最新的。 su…

PMP–一、二、三模、冲刺、必刷–分类–14.敏捷–技巧–刺探

文章目录 技巧一模反例不选“刺探”14.敏捷--流程&#xff1a;&#xff08;2&#xff09;每日站会&#xff08;15分钟、轮流开、提出问题、不解决问题&#xff09;&#xff1a;输入任务板/看板 → 输出任务板更新、燃尽图更新、障碍日志、产品增量&#xff1b;14.敏捷--方法--每…

树莓派扩展RGB点阵屏的使用

本篇来介绍一个树莓派的RGB 8x8点阵屏扩展板的使用。 1 RGB点阵屏 这里使用SunFounder的一个RGB 8x8树莓派扩展板&#xff0c;将其插接到树莓派中即可使用。 2 树莓派IIC配置 树莓派系统的安装&#xff0c;可参考之前的文章&#xff1a; 这个RGB点阵屏与树莓派直接使用IIC通…