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.rhkb.cn/news/298969.html

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

相关文章

docker的安装及入门指令

目录 一、将docker安装到云服务器步骤 1.更新系统yum版本 2.安装所需依赖 3.添加docker仓库设置(使用的是阿里云) 4.安装docker引擎 5.启动docker并开启自动启动 6. 检查是否安装成功,成功会显示相应版本,否则安装失败 二、docker常用命令 1.从…

Javascript/Node.JS中如何用多种方式避免属性为空(cannot read property of undefined ERROR)

>>>>>>问题 "cannot read property of undefined" 是一个常见的 JavaScript 错误,包含我在内很多人都会遇到,表示你试图访问一个未定义(undefined)对象的属性。这通常是因为你在访问一个不存在的对象…

【第十六篇】使用BurpSuite实现匹配替换(实战案例)

在Burp中可配置匹配和替换规则,当我们使用浏览器请求程序时,这些规则会自动修改我们的请求和响应。 在某些环境下,我们可以修改 IP 地址,让服务器相信我们属于其本地网络,从而实现与原本无法访问的内部基础设施进行通信。下面将以IP欺骗为例进行操作讲解。 如图,admin目…

2024.4.2-[作业记录]-day07-CSS 盒子模型(显示模式、盒子模型)

个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 作业 2024.4.2 学习笔记CSS标签元素显示模式1 块元素2 行内元素3 行内块元素4…

蓝桥杯每日一题:公约数(gcd)

题目描述: 给定两个正整数 a 和 b。 你需要回答 q 个询问。 每个询问给定两个整数 l,r,你需要找到最大的整数 x,满足: x 是 a和 b 的公约数。l≤x≤r。 输入格式 第一行包含两个整数 a,b。 第二行包含一个整数 q。 接下来…

Java 设计模式系列:备忘录模式

简介 备忘录模式是一种软件设计模式,用于在不破坏封闭的前提下捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态。 备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定…

Mahalanobis距离(马氏距离)的本质

马氏距离是加权 ℓ 2 \ell_2 ℓ2​范数的特例。 马氏距离是一种基于样本分布的距离,加权矩阵是样本或总体协方差矩阵的逆,其本质为去相关数据标准化,通过数据变换,消除样本中不同特征维度间的相关性和量纲差异。

具有温度系数(Temperature)的Softmax函数

Softmax 函数 softmax 函数是一种激活函数,通常用作神经网络最后一层的输出函数。该函数是两个以上变量的逻辑函数的推广。 Softmax 将实数向量作为输入,并将其归一化为概率分布。 softmax函数的输出是与输入具有相同维度的向量,每个元素的…

hbuilderX创建的uniapp项目转移到vscode

场景:一直使用hbuilderX开发的朋友想转移到vscode获取更好的TypeScript支持,所以想把整个项目目录拖到vscode进行开发,但发现运行不了,提示没有package.json等,并且不能执行pnpm命令 首先,我们先来看一下h…

10.图像高斯滤波的原理与FPGA实现思路

1.概念 高斯分布 图像滤波之高斯滤波介绍 图像处理算法|高斯滤波   高斯滤波(Gaussian filter)包含很多种,包括低通、高通、带通等,在图像上说的高斯滤波通常是指的高斯模糊(Gaussian Blur),是一种高斯低通滤波。通常这个算法也可以用来模…

错误:找不到或无法加载主类(vscode的解决方法)

项目场景: 某天,喵某人在敲代码的过程中,点击运行代码,突然显示找不到或无法加载主类。之前创建的java文件都可以正常运行。但新建的java文件无论是什么,点击运行都会显示“错误:找不到或无法加载主类”。 …

【Docker系列】在 Linux 上安装 Docker Compose 的简明步骤

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

基于单片机多功能数字钟系统仿真设计

**单片机设计介绍,基于单片机多功能数字钟系统仿真设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机多功能数字钟系统仿真设计是一个结合了硬件仿真、软件编程和时钟管理技术的综合性项目。以下是对该设计项目的概…

在CentOS 7上安装Python 3.7.7

文章目录 一、实战步骤1. 安装编译工具2. 下载Python 3.7.7安装包3. 上传Python 3.7.7安装包4. 解压缩安装包5. 切换目录并编译安装6. 配置Python环境变量7. 使配置生效8. 验证安装是否成功 二、实战总结 一、实战步骤 1. 安装编译工具 在终端中执行以下命令 yum -y groupin…

小林coding图解计算机网络|基础篇02|键入网址到网页显示,期间发生了什么?

小林coding网站通道:入口 本篇文章摘抄应付面试的重点内容,详细内容还请移步:小林coding网站通道 文章目录 孤单小弟——HTTP真实地址查询——DNS指南好帮手——协议栈可靠传输——TCP远程定位——IP两点传输——MAC出口——网卡送别者——交…

顺序表的应用

文章目录 目录1. 基于动态顺序表实现通讯录项目2.顺序表经典算法2.1 [移除元素](https://leetcode.cn/problems/remove-element/description/)2.2 [合并两个有序数组](https://leetcode.cn/problems/merge-sorted-array/description/) 3. 顺序表的问题及思考 目录 基于动态顺序…

VSCode好用插件

由于现在还是使用vue2,所以本文只记录vue2开发中好用的插件。 美化类插件不介绍了,那些貌似对生产力起不到什么大的帮助,纯粹的“唯心主义”罢了,但是如果你有兴趣的话可以查看上一篇博客:VSCode美化 1. vuter 简介&…

特朗普数字钱包被空投100万MVP,加密资产或将提供更多竞选资金

唐纳德.特朗普先生对待加密货币的态度正在发生改变,曾经他对加密货币持有负面的态度,曾多次在公开场合批评比特币等数字货币。然而,随着特朗普NFT等加密资产的上链,他对加密货币的态度也发生了巨大的转变。 据相关媒体报道&#x…

Hadoop-入门

资料来源:尚硅谷-Hadoop 一、Hadoop 概述 1.1 Hadoop 是什么 1)Hadoop是一个由Apache基金会所开发的分布式系统基础架构。 2)主要解决:海量数据的存储和海量数据的分析计算问题。 3)广义上来说,Hadoop…

政安晨【AIGC实践】(一):在Kaggle上部署使用Stable Diffusion

目录 简述 开始 配置 执行 安装完毕,一键运行 结果展示 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 人工智能数字虚拟世界实践 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提…