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

目录

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.mzph.cn/news/685313.shtml

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

相关文章

C语言指针(初阶)

文章目录 1:内存与地址1.1内存1.2:如何理解编址 2:指针变量与地址2.1:指针变量与解引用操作符2.1.1:指针变量2.1.2:如何拆解指针类型2.1.3:解引用操作符 2.2:指针变量的大小 3:指针变量类型的意义代码1解引用修改前解引用修改后 代码2解引用修改前解引用修改后 4:const修饰指针…

如何监控另一台电脑屏幕画面?如何远程监控电脑屏幕?

在数字化时代,随着远程工作和协作的普及,电脑屏幕监控的需求也日益增长。无论是出于安全考虑、提高员工工作效率,还是确保企业机密的保密性,电脑屏幕监控都成为了企业不可或缺的管理工具。那么,如何监控另一台电脑屏幕…

AtCoder Beginner Contest 332 --- E - Lucky bag --- 题解

目录 E - Lucky bag 题目大意&#xff1a; 思路解析&#xff1a; 代码实现&#xff1a; E - Lucky bag 题目大意&#xff1a; 思路解析&#xff1a; 在方差中平均值只与输入有关为定值。看到数据范围为 2 < D < N < 15&#xff0c;想到是否能使用状压dp来进行解答…

Solidworks:平面草图练习

继续练习平面草图&#xff0c;感觉基本入门了。

shell脚本命令:mktemp和install

目录 一、mktemp命令 1、mktemp命令用法和格式 2、mktemp命令的实现原理 3、相关操作 3.1 创建临时文件或目录 3.2 指定临时文件名或目录名的后缀字符位数 3.3 指定临时文件或目录的父目录 3.4 指定临时文件或目录的后缀 4、实现文件独立的目录垃圾箱 二、install命令…

Qt 入门

一、三个窗口的区别 QMainWindow&#xff1a;包含菜单栏、工具栏、状态栏 QWidget&#xff1a;一个普通窗口&#xff0c;不包含菜单栏、状态栏 QDialog&#xff1a;对话框&#xff0c;常用来做登入窗口、弹出窗口 二、vs qt 与QtCreator项目相互转换 在vs端先安装Qt VS Tools…

MySQL数据库基础(四):图形化开发工具DataGrip

文章目录 图形化开发工具DataGrip 一、DataGrip介绍 二、DataGrip安装 三、创建工程 四、连接数据库 五、选择要使用的数据库 六、DataGrip软件设置 1、设置字体大小 2、设置关键字大写 3、自动排版 图形化开发工具DataGrip 一、DataGrip介绍 DataGrip是JetBrains公…

[word] word 2010宏已被禁用警告关闭方法 #媒体#学习方法

word 2010宏已被禁用警告关闭方法 Word2010宏已被禁用警告关闭方法&#xff1a;在「信任中心设置」选项的宏设置中选择「禁用所有宏&#xff0c;并且不通知」即可。 每次打开Word 2010&#xff0c;都会提示「完全警告&#xff1a;宏已被禁用」提示。自从Word 2010安装完毕&am…

Java线程与进程

线程 概念 Java中&#xff0c;线程是程序执行的最小单位&#xff0c;它是进程的一个执行流&#xff0c;也是CPU调度和分配的基本单位。每个进程都可以运行多个线程&#xff0c;这些线程共享进程的内存块&#xff0c;但每个线程都有自己的堆栈和局部变量。 Java中的线程有两种…

Mysql运维篇(四) Xtarbackup--备份与恢复练习

一路走来&#xff0c;所有遇到的人&#xff0c;帮助过我的、伤害过我的都是朋友&#xff0c;没有一个是敌人。如有侵权&#xff0c;请留言&#xff0c;我及时删除&#xff01; 前言 xtrabackup是Percona公司CTO Vadim参与开发的一款基于InnoDB的在线热备工具&#xff0c;具有…

Compose自定义动画API指南

很多动画API都可以自定义其参数达到不同的效果&#xff0c;Compose也提供了相应的API供开发者进行自定义动画规范。 AnimationSpec 主要用存储动画规格&#xff0c;可以自定义动画的行为&#xff0c;在animate*AsState和updateTransition函数中&#xff0c;此函数默认参数为s…

【防网盘在线解压】Peazip 豌豆压缩 v9.7.0

软件介绍 Peazip 是一个免费的文件归档应用程序&#xff0c; 支持跨平台&#xff0c;是和WinRar、WinZip类似软件的开源免费替代品&#xff1b;支持压缩/ 存档到 7Z&#xff0c; ARC、Brotli BR、BZip2、GZip、 PAQ、PEA、RAR、自解压档案、TAR、WIM、XZ、Zstandard ZST、打开…

数据检索:倒排索引加速、top-k和k最邻近

之前在https://www.yuque.com/treblez/qksu6c/wbaggl2t24wxwqb8?singleDoc# 《Elasticsearch: 非结构化的数据搜索》我们看了ES的设计&#xff0c;主要侧重于它分布式的设计以及LSM-Tree&#xff0c;今天我们来关注算法部分&#xff1a;如何进行检索算法的设计以及如何加速倒排…

挑战杯 wifi指纹室内定位系统

简介 今天来介绍一下室内定位相关的原理以及实现方法; WIFI全称WirelessFidelity&#xff0c;在中文里又称作“行动热点”&#xff0c;是Wi-Fi联盟制造商的商标做为产品的品牌认证&#xff0c;是一个创建于IEEE 802.11标准的无线局域网技术。基于两套系统的密切相关&#xff…

【数据结构】LRU Cache

文章目录 LRUCache LRUCache 1. LRUCache是一种缓存的替换技术&#xff0c;在CPU和main memory之间根据计算机的局部性原理&#xff0c;往往会采用SRAM技术来构建CPU和主存之间的高速缓存&#xff0c;DRAM(dynamic random access memory)用于构建主存&#xff0c;LRUCache这种…

命令行参数和环境变量

命令行参数 命令行参数是在用户在命令行中输入命令时&#xff0c;跟随命令一起输入的一些附加信息。这些参数可以用来配置命令的行为或传递一些数据给命令。 让同样的程序在不同的命令行参数下运行出不同的结果&#xff01; 将这些命令和参数可以传给 main 函数生&#xff0…

【教程】MySQL数据库学习笔记(一)——认识与环境搭建(持续更新)

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【MySQL数据库学习】系列文章 第一章 《认识与环境搭建》 第二章 《数据类型》 文章目录 【MySQL数据库学习】系列文章一、认…

图像识别基础之模板匹配

principle 图像匹配 本质&#xff1a;图像的相似度很高(矩阵的相似度很高) code /*\brief 我的图像匹配函数&#xff0c;获取差方和均值最小的矩阵作为结果\param srcPicFile:用以匹配的图像文件\param templatePicFile:模板图像文件\param destPicFile:输出的检测结果文件…

汇报工作时,你的工作会让领导满意吗?

当前你正在做的事 众所周知&#xff0c;跟领导汇报&#xff0c;第一件事需着重汇报你正在做的事&#xff0c;否则领导会感觉你无所事事。 举个例子&#xff1a; 完成了某某项目&#xff0c;在这项目中我负责&#xff1a;协调不同科室之间的纠纷&#xff0c;并把问题集中上报给…

阿里云幻兽帕鲁服务器配置4核16G10M带宽够8个人玩吗?玩起来流畅度怎么样?

阿里云幻兽帕鲁服务器配置4核16G10M带宽这个&#xff0c;个人实测下来&#xff0c;五六个人玩是比较流畅的&#xff0c;不过8个人的话&#xff0c;估计会有点卡。如果是8个人的话&#xff0c;我建议选择8核32G那个配置&#xff0c;更加适合一些。 阿里云一键部署幻兽帕鲁详细教…