Linux-4 gcc和makefile

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

1.设计样例

c语言:linux中用的std=c99版本--可能会出现其他问题

c++:Linux中用的std=c++11--使用c++11版本

Linux没有文件格式的区分,但是编译器区分

gcc编译器的文件格式是filename.c

g++编译器的文件格式是filename.cc或者filename.cpp

gcc完成格式

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

gcc test.c -o my.exe -std=c99

或者

gcc -o my.exe test.c -std=c99

都可以打印出结果

查看g++版本属性

g++ -v或者g++ -version

g++的安装

安装的时候一定要以root的身份进行yum安装,普通用户则无法安装

安装的指令如下,普通用户下,不能用sudo命令的可以看我之前的博客

sudo yum install -y gcc-c++

2.程序的翻译过程 

在c语言中,我们曾经说过,c语言的编译过程就分为四个过程

1.预处理

2.编译

3.汇编

4.链接

通常我们在编译c语言程序中,是会一步到位的编译出代码的结果,而在4个阶段不会停止,而现在可以将每一步停止,从而看到每一步的作用 

预处理

预处理的作用:宏替换,去注释,头文件的展开,以及条件编译

gcc命令:

gcc -E test.c -o test.i

从现在开始程序的翻译,预处理完成就停下

去注释: 

查看头文件的命令:

vim /usr/include/stdio.h

用来查看预处理是否是头文件的展开

条件编译:

如果编译成果第一个条件V1,则不会去进行编译下面的程序

编译

编译的作用:将c语言翻译成汇编语言

gcc命令:

gcc -S test.i -o test.s

从现在开始程序的编译,编译完成就停下

得到汇编语言:

汇编

汇编的作用:将汇编语言翻译成二进制语言

gcc命令:

gcc -c test.s -o my.exe

从现在开始程序的编译,汇编完成就停下

得到二进制文件:

链接

gcc命令:

gcc -o test.o -o test.c
1.链接是什么? 

我们的程序需要与库结合,而语言是一定要具有自己的库的

2.为什么? 

a.让开发站在巨人的肩膀上

b.提高开发效率

3.怎么办?

Linux中

动态库:.so        与动态库链接就是动态链接

静态库:.a         与静态库链接就是静态链接

ldd 可执行文件:可以查看所连接可库

 由此可以看到时运用的时动态链接

在这里涉及到一个重要的概念:函数库

我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?
最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到
系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函
数“printf”了,而这也就是链接的作用

函数库一般分为静态库和动态库两种

静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”
动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。

gcc hello.o –o hello
gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证

注意:

c静态库时默认生成的

gcc默认生成的可执行程序,是默认采用动态链接

动态库和动态链接的优缺点:

1.不能丢失

2.节省资源

每一次程序编译时,都要与动态库链接 

查看动态库版本属性

ls /lib64/lib.so.6 -l

静态库和静态库链接的优缺点:

1.一旦形成,与库无关

2.浪费资源

静态链接时将静态库拷贝到文件中去,占的内存较大 

查看静态库版本属性

ls /lib64/libc.a -l

默认情况下,linux中是没有静态库的

动静态链接比较

动态链接会比静态链接产生文件会小很多,也更加节省资源

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

1.背景

个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率
make是一个命令工具,是一个解释makefile中指令的命令工具
make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建

2.原理

makefile(Makefile)是和源代码同目录下的文件 

如下,是一个makefile文件中的内容

mytest:目标文件        会默认形成第一个目标文件

test.c:依赖文件列表,可以多写文件,空格隔开,test1.c test2.c test3.c ...

gcc test.c -o mytest -std=c99:是依赖方法

.PJONY xxx:对应的方法总是要被执行的,如果没有.PHONY,此方法执行过一此后,若文件内容没有修改,则不会再次执行

a.为什么makefile对最新的可执行程序,默认不重新生成 ?

为了提高编译的效率

b.怎么做到的?

对比,可执行文件修改的时间和源文件最近修改的时间,如果可执行文件修改时间早于源文件,则重新生成,反之,则不生成。

3.我们自己的makefile

看一个新版的makefile

$:表示扩展打开中定义的变量

$@:表示包含的目标文件

$^:表示所有包含的依赖列表

makefile定义变量时,等号两边不能带空格

$@=mytest,$^=test.c

那要怎么隐藏我们所make命令后总是会出现的依赖方法

@依赖方法:可以隐藏打印过程

touch 文件名:是刷新文件,来让make可以重新编译

4.用程序运行的过程来用makefile运行

由上可以看出,我们写出的makefile文件和程序的运行过程是反过来的,依旧可以运行,原先运行时,只是默认运行第一个列表的依赖方法,但是这个make命令后却运行出来全部的命令。

原因:

        目标文件需要依赖文件列表来实现,但是如上代码和程序运行顺序可知,要运行可执行程序my.exe需要test.o文件,之后再会向下查找有无文件,test.o文件也需要test.s文件,再向下查找,test.s文件也需要test.i文件,再向下查找,test.i文件需要test.c文件,找到test.c文件之后再逐层向上运行依赖方法,依次得到test.i,test.s,test.o,my.exe.

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

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

相关文章

蓝桥杯练习笔记(十七)

蓝桥杯练习笔记(十七) 一、 输入样例 7 7 1000001 0100010 0010100 0001AAA 00010A0 00010A0 00010A0蓝桥官网题解: 该题解是用了三个循环分别对三个方向的相同字符的长度进行统计,找出最大长度,最后对找出的最长Y进…

做好产品定位的3个重点

产品定位对于项目而言至关重要,正确的产品定位有助于项目锁定目标市场,精准满足客户需求。通过差异化产品策略,让产品在众多竞品中脱颖而出,形成独特竞争优势,从而有助于产品价值的实现。 因此做好产品定位迫在眉睫&am…

软件杯 深度学习中文汉字识别

文章目录 0 前言1 数据集合2 网络构建3 模型训练4 模型性能评估5 文字预测6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 深度学习中文汉字识别 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐&#xf…

【Linux】从零认识文件操作

送给大家一句话: 要相信,所有的不美好都是为了迎接美好,所有的困难都会为努力让道。 —— 简蔓《巧克力色微凉青春》 开始理解基础 IO 吧! 1 前言2 知识回顾3 理解文件3.1 进程和文件的关系3.2 文件的系统调用openwrite文件 fd 值…

OpenHarmony实战:小型系统平台驱动移植

在这一步,我们会在源码目录//device/vendor_name/soc_name/drivers目录下创建平台驱动。 建议的目录结构: device ├── vendor_name │ ├── drivers │ │ │ ├── common │ │ │ ├── Kconfig # 厂商驱动内核菜单入口 │ …

七大开源基金会联合制定符合 CRA 法案的共同标准

欧洲议会上个月通过的《欧洲网络弹性法案》(CRA) 制定通用规范和标准 Apache 软件基金会、Blender 基金会、Eclipse 基金会、OpenSSL 软件基金会、PHP 基金会、Python 软件基金会 和 Rust 基金会 这项工作由 Eclipse 基金会牵头,旨在建立基于现有开源最佳实践的安全…

9.图像中值腐蚀膨胀滤波的实现

1 简介 在第七章介绍了基于三种卷积前的图像填充方式,并生成了3X3的图像卷积模板,第八章运用这种卷积模板进行了均值滤波的FPGA实现与MATLAB实现,验证了卷积模板生成的正确性和均值滤波算法的MATLAB算法实现。   由于均值滤波、中值滤波、腐…

leet hot 100-13 最大子数组和

53. 最大子数组和 原题链接思路代码 原题链接 leet hot 100-10 53. 最大子数组和 思路 生成一个数字来记录last 表示前面数字全部之和与0取最大值 如果大于0 就加上如果不大于0 就不管 从当前位置从新开始遍历计算 时间复杂度O(n) 空间复杂度(1) 代码 class Solution {…

JVM剖析

0.前言 Java 是当今世界使用最广泛的技术平台之一。使用 Java 或 JVM 的一些技术包括: Apache spark用于大数据处理,数据分析在JVM上运行;用于数据流的Apache NiFi在内部使用的也是 JVM;现代 Web 和移动应用程序开发中使用的React native使用 的也包含…

HTTPS RSA 握手解析(计算机网络)

传统的 TLS 握手基本都是使用 RSA 算法来实现密钥交换的,在将 TLS 证书部署服务端时,证书文件其实就是服务端的公钥,会在 TLS 握手阶段传递给客户端,而服务端的私钥则一直留在服务端。 在 RSA 密钥协商算法中,客户端会…

佳能打印机E568扫描书和文件方法

官方网站; Canon : Inkjet 手册 : IJ Scan Utility : 启动IJ Scan Utility 打开打印机电源 扫描一个文件,翻页后盖好盖子。再点击扫描。 所有扫描结束之后点退出 点击保存

【无限列车1】SpringCloudAlibaba 与 SpringBoot后端架构的搭建

【无限列车1】SpringCloudAlibaba 与 SpringBoot后端架构的搭建 1、版本说明二、日志相关配置3、AOP 打印日志4、下载开源前端后台管理系统5、添加网关模块6、集成数据库和mp(1) 添加驱动和mp依赖(2) 数据库配置(3) 使用MybatisPlus 7、加密 yaml 文件中的内容(1) 依赖(2) 敏感…

02---webpack基础用法

01 entry打包的入口文件: 单入口entry是一个字符串:适用于单页面项目module.exports {entry:./src/index.js}多入口entry是一个对象module.exports {entry:{index:./src/index.js,app:./src/app.js}} 02 output打包的出口文件: 单入口配置module.ex…

基于SSM的网络视频播放器

目录 背景 技术简介 系统简介 界面预览 背景 互联网的迅猛发展彻底转变了全球各类组织的管理策略。自20世纪90年代起,中国政府和企业便开始探索利用网络系统进行信息管理。然而,早期的网络覆盖不广泛、用户接受度不高、相关法律法规不完善以及技术开…

C#实现只保存2天的日志文件

文章目录 业务需求代码运行效果 欢迎讨论! 业务需求 在生产环境中,控制台窗口不便展示出来。 为了在生产环境中,完整记录控制台应用的输出,选择将其输出到文件中。 但是,存储所有输出的话会占用很多空间,…

uniApp使用uview对vuex的二次封装实现全局变量

1、uni-app目根目录新建’/store/index.js’,并复制如下内容到其中 2、uni-app目根目录新建’/store/ u . m i x i n . j s ′ ,并复制如下内容到其中,由于 H X 某些版本的限制,我们无法帮您自动引入 " u.mixin.js&#xff0…

element-ui card 组件源码分享

今日简单分享 card 组件源码,主要从以下两个方面: 一、card 组件页面结构 二、card 组件属性 2.1 header 属性,设置 header,也可以通过 slot#header 传入 DOM,类型 string,无默认值。 组件使用部分&#…

Linux TUN设备实现Tunnel性能分析

一、TUN/TAP设备原理: Linux的TUN/TAP设备是一种可以使得应用层与TCP/IP协议栈交互的驱动模块,通常用于组建虚拟局域网中的点对点隧道(Tunnel),可以工作于2层(TAP设备)和3层(TUN设备…

Linux的软链接和硬链接

1、软链接 概念:给文件创建一个快捷方式,依赖原文件,和普通文件没有区别。 特性: 可以给存在的文件或目录创建软链接可以给不存在的文件或目录创建软链接可以跨文件系统创建软链接删除软链接不影响原文件、删除原文件会导致软链…

moment.js 产出未知格式的时间,可能的原因

moment.js 产出未知格式的时间,可能的原因 有个问题困扰我好久了,在项目中使用格式化时间的时候会产出一些千奇百怪的格式,产出的文字我都不认识。 百思不得其解,终于今天在看代码的时候发现了这个问题。 它的表现是这样的&…