【Linux】Linux编译器-gcc/g++ Linux项目自动化构建工具-make/Makefile

news2025/1/11 18:44:54

目录

Linux编译器-gcc/g++使用

1.背景知识

 Linux中头文件的目录在

Linux 库

条件编译的典型应用

2.gcc如何完成

动态库 vs 静态库

debug && release

Linux项目自动化构建工具-make/Makefile

背景

用法

特殊符号 


Linux编译器-gcc/g++使用

1.背景知识

  1. 预处理(去注释,头文件展开,条件编译,宏替换)
  2. 编译(生成汇编)
  3. 汇编(生成机器可识别代码)
  4. 连接(生成可执行文件或库文件)

 Linux中头文件的目录在

/usr/include/

可如下进行查看 

Linux 库

Linux中:.so(动态库)   .a(静态库) .iso(镜像文件的后缀)

windows:.dll(动态库)   .lib(静态库)

        动态库就像一个网吧,所有人都可以去上网,也就是一个共享库,因此动态库不能缺失,一旦对应的动态库缺失,影响的不止一个程序,可能导致很多程序都无法正常运行。

        静态库就像一个电脑店,每个人需要上网时,买一台电脑回家,也就是编译器使用静态库进行静态链接的时候,会将自己的方法拷贝到目标程序,该程序以后不再依赖静态库

在Linux中库有自己的命名规则 

libname.so.XXX  //红色部分为库名字,需要去掉前缀后缀

在编译型语言,安装开发包,就是下载安装 对应的头文件+库文件,而方法的实现就是在库当中。库其实就是把源文件(.c)经过一定的编译,然后打包,只给一个文件即可,不用提供太多的文件。--这样做也可以达到隐藏源文件的目的

头文件提供方法的声明,库文件提供方法的实现+我们自己写的代码 ==>> 软件

条件编译的典型应用

我们安装软件通常有社区版和开发版,根据不同的编译条件,裁剪掉社区版不需要的功能即可

2.gcc如何完成

编译的c语言的代码,会自己链接c库

gcc 选项
  • -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
  • -S  编译到汇编语言不进行汇编和链接
  • -c  编译到目标代码
  • -o 文件输出到 文件
  • -static 此选项对生成的文件采用静态链接
  • -g 生成调试信息。GNU 调试器可利用该信息。
  • -shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
  • -O0
  • -O1
  • -O2
  • -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
  • -w  不生成任何警告信息。
  • -Wall 生成所有警告信息。

格式

gcc [选项]  要编译的文件 [选项]  [目标文件]

gcc -E mycode.c  -o mycode.i //只进行预处理

  • -E  告诉gcc,从现在开始进行程序的翻译,将预处理工作做完就停下来,不要往后走了。
  • -o  后面跟要形成的文件,否则会直接输出在屏幕上

gcc -S mycode.i -o mycode.s

  • -S  从现在开始进行程序的翻译,将编译的工作做完就停下来

gcc -c mycode.s -o mycode.o

-c  从现在开始进行程序的翻译,将汇编的工作做完就停下来,mycode.o是可重定位目标二进制文件,简称目标文件,即windows下的obj的文件,该文件虽然已经是二进制了,但是还不能独立执行,需要经过链接才能执行

gcc mycode.o -o mytest

将可重定向目标二进制文件 和 库进行链接形成可执行程序

//PS 上述选项通过 Esc 按键进行记忆

 那么上述.o和库是如何链接的 ?

 gcc编译的时候,默认使用动态链接,如果要按照静态链接的方式,进行形成可执行程序,需要添加 -static 选项

安装c语言静态库

yum install -y glibc-static

安装c++语言静态库 

yum install -y libstdc++-static

  • 如果我们没有静态库,但是我们要-static是不行的
  • 如果我们没有动态库,只有静态库,不加-static ,gcc能找到静态库,gcc默认优先动态链接,-static的本质是:改变优先级
  • 不一定是纯的全部动态链接或者静态链接,一般是混合的

动态库 vs 静态库

动态库因为是共享库,因此可以有效的节省资源(磁盘空间,内存空间,网络空间)【优点】,动态库一旦缺失,会导致整个程序都无法运行【缺点】

静态库,不依赖库,一旦形成可执行程序,可以独立运行【优点】,体积大,比较消耗资源【缺点】

debug && release

gcc默认形成的是release版本,-g 以debug版本

debug版本可以被追踪调试,因为形成可执行程序的时候,添a加了debug信息。

可执行程序形成的时候,不是无序的二进制构成,有自己的二进制格式--ELF格式

Linux项目自动化构建工具-make/Makefile

背景

  • 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
  • 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的
  • 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作
  • makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编 译,极大的提高了软件开发的效率。
  • make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命 令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一 种在工程方面的编译方法。
  • make是一条命令,makefile是一个当前目录下的文件,两个搭配使用,完成项目自动化构建。

用法

在当前目录下创建一个makefile文件

mycode:mycode.c    //依赖关系,mycode.c 编译成mycode

        gcc -o mycode mycode.c   //依赖方法,怎么编译

clean:              //清理,:右边没有东西表示不依赖任何文件

        rm -f mycode 

为了更好的理解编译过程,上述依赖关系/依赖方法可细写成

mycode:mycode.o

        gcc -o mycode mycode.o

mycode.o:mycode.s

        gcc -c mycode.s -o mycode.o

mycode.s:mycode.i

        gcc -S mycode.i -o mycode.s

mycode.i:mycode.c

        gcc -E mycode.c -o mycode.i

clean:

        rm -f mycode.i ……

//编译 ,make会自动推导makefile中的依赖关系栈式结构

make

//清理

make clean 

  • make一般自顶向下匹配,如果将clean放到前面,make将执行清理工作,所以一般不将clean放到前面 
  • make之后,如果代码未修改,重复make不会再编译,以此来提高编译效率,那make是怎么做到的呢?一定是源文件形成可执行文件,也就是说先有源文件,才有可执行文件,一般而言源文件的修改时间 比 可执行文件要早的!!如果我们更改了源文件,历史上还有可执行文件,那么源文件的最近修改时间,一定要比可执行程序要新!因此,只需要比较可执行程序的最近修改时间 和 源文件的最近修改时间 .exen 新于 .c 就不需要重新编译,反之就需要重新编

要时make每次都编译,可以在makefile文件中

.PHONY:伪文件

.PHONY:mycode     //让对应的依赖关系总是被执行

mycode:mycode.c    //依赖关系,mycode.c 编译成mycode

        gcc -o mycode mycode.c   //依赖方法,怎么编译

clean:              //清理,:右边没有东西表示不依赖任何文件

        rm -f mycode 

不过一般依赖关系不用伪文件修饰, 伪文件用来修饰clean,即

.PHONY:clean

clean:              //清理,:右边没有东西表示不依赖任何文件

        rm -f mycode 

特殊符号 

mycode:mycode.c

gcc -o $@ $^  //$@表示依赖关系左边的内容,$^表示依赖关系右边的内容

如果不想make的时候,界面回显依赖方法,可将依赖方法前+@ ,如

mycode:mycode.c    //依赖关系,mycode.c 编译成mycode

        @gcc -o mycode mycode.c   //依赖方法,怎么编译

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

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

相关文章

platformio 提示 fatal error: TimeLib.h: No such file or directory 的解决方案

在platformio编译arduino项目的时候,如果提示fatal error: TimeLib.h: No such file or directory,解决方法有2: 方法1: 在项目的platformio.ini文件中,添加 lib_deps # Using library Id44方法2: 通过…

Java Web 中forward 和 redirect 的区别

前言 在Java Web开发中,页面跳转是构建用户界面和实现业务逻辑的重要组成部分。Forward(转发)和Redirect(重定向)是两种常见的跳转方式,它们分别具有不同的特点和适用场景。正确地选择和使用这两种跳转方式…

day14笔记(多态)

多态 自己写多态演示遇见两个问题 1.在类里写show方法时犹豫要不要写参数,其实不用写参数也可以获取到类的信息 public void show(){//括号里面写参数吗System.out.println(getName()", "getAge());} 2.在测试类里面写方法时,写了一个show方法带参数,其实这里应该是…

Vite 5.0 正式发布

11 月 16 日,Vite 5.0 正式发布,这是 Vite 道路上的又一个重要里程碑!Vite 现在使用 Rollup 4,这已经代表了构建性能的大幅提升。此外,还有一些新的选项可以改善开发服务器性能。 Vite 4 发布于近一年前,它…

C++中类的6个默认成员函数 【拷贝构造函数】

文章目录 拷贝构造函数的使用拷贝构造对于自定义类型【浅拷贝】深拷贝拷贝构造函数典型调用场景 拷贝构造函数的使用 在前几章学习对象的时候,我们有的时候需要一个与已存在对象一某一样的新对象 那在创建对象时,可否创建一个与已存在对象一某一样的新对…

用HTML和CSS打造跨年烟花秀视觉盛宴

目录 一、程序代码 二、代码原理 三、运行效果 一、程序代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>跨年烟花秀</title><meta name"viewport" content"widthdevi…

[01] Vue2学习准备

目录 vue理解创建实例插值表达式 {{}}响应式特性 vue理解 Vue.js 是一套构建用户界面的渐进式框架。 Vue 只关注视图层&#xff0c; 采用自底向上增量开发的设计。 Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。 创建实例 准备容器 <div id…

初识Qt | 从安装到编写Hello World程序

文章目录 1.前端开发简单分类2.Qt的简单介绍3.Qt的安装和环境配置4.创建简单的Qt项目 1.前端开发简单分类 前端开发&#xff0c;这里是一个广义的概念&#xff0c;不单指网页开发&#xff0c;它的常见分类 网页开发&#xff1a;前端开发的主要领域&#xff0c;使用HTML、CSS …

leetcode刷题--贪心算法

七. 贪心算法 文章目录 七. 贪心算法1. 605 种花问题2. 121 买卖股票的最佳时机3. 561 数组拆分4. 455 分发饼干5. 575 分糖果6. 135 分发糖果7. 409 最长回文串8. 621 任务调度器9. 179 最大数10. 56 合并区间11. 57 插入区间13. 452 用最少数量的箭引爆气球14. 435 无重叠区间…

Deep learning学习笔记

lec 1&#xff1a;Regression 1.5 Linear neural networks for regression线性神经网络的回归 I parameterizing output layer, I handling data, I specifying loss function, I training model. 浅层网络包括线性模型&#xff0c;其中包含了许多经典的统计预测方法&…

网络安全防御保护 Day5

今天的任务如下 要求一的解决方法&#xff1a; 前面这些都是在防火墙FW1上的配置。 首先创建电信的NAT策略 这里新建转换后的地址池 移动同理&#xff0c;不过地址池不一样 要求二的解决方法&#xff1a; 切换至服务器映射选项&#xff0c;点击新建&#xff0c;配置外网通过…

JDBC 核心 API

引入 mysql-jdbc 驱动 驱动 jar 版本的选择&#xff1a;推荐使用 8.0.25&#xff0c;省略时区设置java 工程导入依赖 项目创建 lib 文件夹导入驱动依赖 jar 包jar 包右键 - 添加为库 JDBC 基本使用步骤 注册驱动获取连接创建发送 sql 语句对象发送 sql 语句&#xff0c;并获…

讲解用Python处理Excel表格

我们今天来一起探索一下用Python怎么操作Excel文件。与word文件的操作库python-docx类似&#xff0c;Python也有专门的库为Excel文件的操作提供支持&#xff0c;这些库包括xlrd、xlwt、xlutils、openpyxl、xlsxwriter几种&#xff0c;其中我最喜欢用的是openpyxl&#xff0c;这…

LEETCODE 315. 计算右侧小于当前元素的个数(归并)

class Solution { public: // 将count声明为publicvector<int> count; vector<int> indexs,tmp;public:vector<int> countSmaller(vector<int>& nums) {//归并int left0;int rightnums.size()-1;//计数// vector<int> count(nums.size()); …

题解37-42

101. 对称二叉树 - 力扣&#xff08;LeetCode&#xff09; 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,nul…

【C++】友元、内部类和匿名对象

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 1. 友元 1.1 友元函数 1.2 友元类 2. 内部类 2.1 成员内部类 2.2 局部内部类 3. 匿名对象 3.1 基本概念 3.1 隐式转换 1…

(10)Hive的相关概念——文件格式和数据压缩

目录 一、文件格式 1.1 列式存储和行式存储 1.1.1 行存储的特点 1.1.2 列存储的特点 1.2 TextFile 1.3 SequenceFile 1.4 Parquet 1.5 ORC 二、数据压缩 2.1 数据压缩-概述 2.1.1 压缩的优点 2.1.2 压缩的缺点 2.2 Hive中压缩配置 2.2.1 开启Map输出阶段压缩&…

threejs之使用shader实现雷达扫描

varying vec2 vUv; uniform vec3 uColor; uniform float uTime;mat2 rotate2d(float _angle){return mat2(cos(_angle),-sin(_angle),sin(_angle),cos(_angle)); }void main(){vec2 newUv rotate2d(uTime*6.18)*(vUv-0.5);float angle atan(newUv.x,newUv.y);// 根据uv坐标获…

那些杠鸿蒙的现在怎么样了?

别杠&#xff0c;要杠就是你对。 一个纯血鸿蒙就已经打了那些杠精的嘴&#xff0c;以前是套壳Android&#xff0c;大家纷纷喷鸿蒙。现在鸿蒙已经全栈自研&#xff0c;并且已经展开各大企业生态合作。不管什么独立系统&#xff0c;都是一定要走一遍套壳Android的道路的&#xf…

幻兽帕鲁云服务器搭建零基础教程,新手小白一看就会

以下教程基于阿里云服务器ECS 来搭建幻兽帕鲁游戏服务器&#xff0c;通过一键部署的方式&#xff0c;最快1分钟即可完成部署。 阿里云一键部署幻兽帕鲁的活动地址&#xff1a;1分钟畅玩&#xff01;一键部署幻兽帕鲁联机服务器 首先&#xff0c;打开阿里云的这个游戏服务器活…