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.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

利用Spark将Kafka数据流写入HDFS

利用Spark将Kafka数据流写入HDFS 在当今的大数据时代,实时数据处理和分析变得越来越重要。Apache Kafka作为一个分布式流处理平台,已经成为处理实时数据的事实标准。而Apache Spark则是一个强大的大数据处理框架,它提供了对数据进行复杂处理…

可行性研究报告模板(套用)

1业务需求可行性分析 2技术可行性分析 2.1规范化原则 2.2高度的兼容性和可移植性 2.3人性化、适用性 2.4标准化统一设计原则 2.5先进安全可扩展性原则 3开发周期可行性分析 4人力资源可行性分析 5成本分析 6收益分析 7结论 所有资料获取进主页或本文末个人名片直接…

【OSTEP】并发:线程与多线程

" A flow of control within a process that consists of a PC, a register set and a stack space" 本章将介绍为单个运行进程提供的新抽象 —— 线程 (thread) 线程是 调度的一个基本单位(basic unit of CPU scheduling)一个单独的线程至…

RUST语言函数的定义与调用

1.定义函数 定义一个RUST函数使用fn关键字 函数定义语法: fn 函数名(参数名:参数类型,参数名:参数类型) -> 返回类型 { //函数体 } 定义一个没有参数,没有返回类型的参数 fn add() {println!("调用了add函数!"); } 定义有一个参数的函数 fn add(a:u32)…

力扣热题100_链表_21_合并两个有序链表

文章目录 题目链接解题思路解题代码 题目链接 21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4] 示例…

InternLM2-lesson2作业

书生浦语大模型趣味 Demo 视频连接:https://www.bilibili.com/video/BV1AH4y1H78d/?vd_source902e3124d4683c41b103f1d1322401fa 目录 书生浦语大模型趣味 Demo一、基础作业二、进阶作业 一、基础作业 第一次执行: 第二次执行: 第一次执…

uni-app 实现仿微信界面【我的+首页聊天列表+长按菜单功能+添加菜单功能】+ 附源码

目录 【微信首页聊天列表】界面 【我的】界面 源代码: 文后附完整代码,支持一键导入 HBuilderX 示例体验 【微信首页聊天列表】界面 仿造【微信首页聊天列表 长按菜单功能 右上角添加按钮弹窗功能】,使用 uni-app 开发, 一…

蓝桥杯真题:路径

import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {int n 2022; //从下标为1开始&#xff0c;方便计算int[] q new int[n]; //存储最短路q[1] 0; //起始条件for (int i 2; i < 202…

黑马java-JavaWeb-Maven

1.Maven是专门用于管理和构建java项目的工具&#xff0c;它的主要功能有&#xff1a; 提供了一套标准化的项目结构提供了一套标准化的构建流程提供了一套依赖管理机制&#xff08;管理项目所依赖的第三方资源&#xff09; 2.Maven仓库 本地仓库&#xff1a;自己计算机上的一个目…

docker环境中宿主机防火墙添加ssh无法生效的问题分析

背景 在部署了docker容器的环境中&#xff0c;要在防火墙开通22端口&#xff0c;即ssh服务&#xff0c;以便在终端可以正常登陆。使用firewall-cmd在docker区域添加了22端口&#xff0c;但是没有起作用。后再public区域添加22端口才起作用。为什么docker区域不起作用&#xff…

单位档案室用综合档案管理系统还是馆藏档案管理系统

单位档案室应该使用综合档案管理系统。 综合档案管理系统是一种全面管理各类档案的系统&#xff0c;可以对文书档案、电子档案、纸质档案等进行统一管理和检索。综合档案管理系统可以满足单位档案室的多种需求&#xff0c;包括文书档案的归档、借阅、追溯等功能&#xff0c;同时…

进阶线段树之乘法线段树

1.乘法线段树 顾名思义&#xff0c;就是其中的区间修改为乘法&#xff0c;但是呢&#xff0c;如果只是一个乘法&#xff0c;把之前的加号变成*号&#xff0c;然后开long long即可&#xff08;因为乘法的数据超大&#xff0c;如果不在中间mod点儿东西还能直接超出64位&#xff…

一分钟了解MOS管基础知识

场效应管&#xff08;Field-Effect Transistor&#xff0c;简称FET&#xff09;是电子技术中广泛使用的一种半导体器件&#xff0c;具有高输入阻抗、噪声低和低功耗等优点。 简介 场效应管是一种电压控制器件&#xff0c;其工作原理是通过改变栅极&#xff08;Gate&#xff09;…

【前端面试3+1】11 http和https有何不同及https的加密过程、数组有哪些方法及作用、tcp三次握手四次挥手、【分发饼干】

一、http和https有何不同&#xff1f;https的加密过程 1、不同&#xff1a; HTTP和HTTPS的主要区别在于安全性。HTTP是超文本传输协议&#xff0c;是一种用于传输数据的协议&#xff0c;但是传输的数据是明文的&#xff0c;容易被窃听和篡改。而HTTPS是在HTTP基础上加入了SSL/T…

LeetCode.1379. 找出克隆二叉树中的相同节点

题目 1379. 找出克隆二叉树中的相同节点 分析 这道题目其实利用的是递归的思想&#xff0c;同时遍历两棵树即可。具体流程&#xff08;下面所讲解的流程基于的前提一定是两棵树一起遍历哦&#xff09;&#xff1a; 如果 original 为空节点&#xff0c;直接返回 null&#…

Python 爬虫基础——http请求和http响应

写本篇文章&#xff0c;我认为是能把自己所理解的内容分享出来&#xff0c;说不定就有和我一样有这样思维的共同者&#xff0c;希望本篇文章能帮助大家&#xff01;✨✨ 文章目录 一、 &#x1f308;python介绍和分析二、 &#x1f308;http请求三、 &#x1f308;http响应四、…

初识MySQL(中篇)

使用语言 MySQL 使用工具 Navicat Premium 16 代码能力快速提升小方法&#xff0c;看完代码自己敲一遍&#xff0c;十分有用 目录 1.SQL语言 1.1 SQL语言组成部分 2.MySQL数据类型 2.1 数值类型 2.2 字符串类型 2.3 日期类型 3.创建数据表 3.1 创建数据表方法1 …

00-JAVA基础-注解及反射解析注解

注解 什么是注解 Java 注解&#xff08;Annotation&#xff09;是 JDK 5.0 引入的一种元素&#xff0c;用于为 Java 代码提供元数据。元数据是关于数据的数据&#xff0c;它为代码提供附加信息&#xff0c;而这些信息并不直接参与到程序的逻辑中&#xff0c;但可以被编译器或…

如何根据黄金行情进行交易操作?

根据黄金行情进行交易操作是许多投资者关注的重要议题&#xff0c;黄金作为一种重要的避险资产和投资工具&#xff0c;其价格波动受多种因素影响&#xff0c;包括经济数据、地缘政治风险、货币政策等。为了有效地进行黄金交易操作&#xff0c;投资者需要综合考虑多方面因素&…

ST表---算法

相当于二分的思想&#xff0c;一直比较最值 ST的创建 现在创建成功&#xff0c;是应该如何查询的问题 ST表的查询 虽然这两区间有重叠&#xff0c;但是可以一个往前数&#xff0c;一个往后数&#xff0c;互不影响 时间复杂度 创建st表的复杂度为n*logn 使用时的复杂度为O(…