Linux的开发工具(二):编译器gcc/g++与Linux项目自动化构建工具-Makefile

目录

Linux的编译器-gcc/g++

问题一:gcc有时候为什么不能编译带有for循环的c语言源文件?

问题二:gcc中c++源文件的后缀是什么?

问题三:gcc能编译c++的源文件文件吗? 

问题四:如何查看自己是否拥有g++?如何安装g++?

再次理解程序的翻译过程

动态链接和静态链接

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


Linux的编译器-gcc/g++

基本概念:gcc是专门用来编译c语言的,g++可以编译c++或c语言

问题一:gcc有时候为什么不能编译带有for循环的c语言源文件?

答:gcc版本过低会不支持for循环等c99标准下的内容

解决方式:gcc 源文件名 -std=c99-std=c99是为了让gcc支持c99中的语法)

此外,gcc还可以指定编译生成的可执行程序文件名:gcc -o 自定义名称 源文件 -std=c99 

问题二:gcc中c++源文件的后缀是什么?

答:.cc、.cpp、.cxx,不能

问题三:gcc能编译c++的源文件文件吗? 

答:不能,c++的源文件只能由g++来编译

指令:g++ -o my.exe test.cc -std=c++11

此外,g++也支持编译c语言的源文件,所以:g++ -o my.exe test.c -std=c99

问题四:如何查看自己是否拥有g++?如何安装g++?

答:g++ --version查看g++版本,sudo yum install -y gcc-g++指令进行g++的安装

再次理解程序的翻译过程

过程

gcc命令

说明
预处理gcc -E test.c -o test.i宏替换、去注释、头文件展开、条件编译
编译gcc -S test.i -o test.s将源代码翻译成汇编语言
汇编gcc -c test.s -o test.o汇编语言变为机器码,生成目标文件
链接gcc  test.c -o my.exe

目标文件和库函数结合,生成形成可执行程序

  • -E:从现在开始进行程序的翻译,预处理完成就停下
  • -S:从现在开始进行程序的编译,编译完成就停下
  • -c:从现在开始进行程序的翻译,汇编完成就停下

1、gcc -E test.c -o test.i:将源文件预处理后的结果放入test.i文件

2、gcc -S test.i -o test.s:将test.i文件编译后的结果放入test.s文件

3、gcc -c test.s -o test.o:将汇编语言转换为机器码,然后放入test.o文件

动态链接和静态链接

基本概念:两种不同的链接方式,用于将程序中使用的函数库与程序本身结合起来

动态链接:

  • 特点:告诉了程序目标库的地址,使用该库中的内容时回去该库中调用
  • 优点节省资源
  • 缺点多个程序共享动态库,一旦动态库缺失,所有动态链接这个库的程序都无法执行了

静态链接:

  • 特点:在编译时就把库中的方法拷贝到程序中,之后就不再与库产生任何联系了
  • 优点浪费资源
  • 缺点一旦形成与库无关

在Linux系统中,.so 文件是动态链接库 .a 文件是静态库,且默认情况下linux不会安装静态库

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

基本概念:会不会makefile,从侧面说明了一个人是否具备完成大型Linux工程的能力,一个工程中的源文件不计其数,它们按照类型、功能、模块分别放在若干个目录中,makefile中定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作

优点:自动化编译,一旦写好,只需要一个make命令,整个工程就会进行编译,提高开发效率

主要组成部分:依赖关系 + 依赖方法

Makefile文件:
hello: hello.ogcc hello.o -o hellohello.o: hello.sgcc -c hello.s -o hello.ohello.s: hello.igcc -S hello.i -o hello.shello.i: hello.cgcc -E 	hello.c -o 	hello.i .PHONY:clean
clean:rm -f hello.i hello.s hello.o hello 
  • hello依赖hello.o、hello.o依赖hello.s、hello依.s赖hello.i、hello.i依赖hello.c 

make的工作原理(只输入make命令)

  1. make会进入makefile文件
  2. 进入makefile后先去找第一个目标文件(找到hello并视其为最终要完成的目标文件)
  3. 若它不存在或它所依赖的文件的更新过,就会重编译该执行文件从而生成(更新)目标文件
  4. 若所依赖文件也不存在,make会尝试在后续文件列表中找到生成该文件的指令并执行
  5. make会一层层的去找文件的一依赖关系,直到最终编译出第一个目标文件
  6. 在寻找过程中,如果出现错误(最后被依赖的文件找不到)make就会直接退出并报错,对于所定义的命令的错误,若编译不成功,make不会理会

注意事项:

1、make是一个解释makefile中指令的指令工具、makefile是文件,它还可以写成Makefile

2、默认情况make会从上至下在makefile中读取目标文件,并优先选择第一个目标文件为生成对象

3、目标文件:后的内容是一个文件列表,文件列表可以为空,可以是多文件

4、程序会根据依赖关系执行依赖方法

5、.PHONY修饰的目标文件,该目标文件在每次make时一定会执行(mytest如果没被.PHONY修饰则在第二次make时会报错,如果有修饰则不会报错每次都会编译)

6、依赖方法前最好有一个tab留出空间,便于与依赖关系区分

7、目标文件是指需要被构建的最终产物或中间产物(:前的文件名) 

7、make会依据目标文件中的依赖关系,进行自动推导,帮助我们执行所有相关的依赖方法

8、@和^最后会自动转化为目标文件和依赖文件列表中的文件

9、makefile也支持变量名表示文件,类似于宏定义不需要变量类型,$(变量名)提取变量

10、如果不想执行make打印出依赖方法的语句,可以在这些语句前加@

11、依赖方法后还可以跟shell命令,在命令前加上@就不会显示该命令(其余功能有待学习)

常见功能:

1、将test.c编译成目标文件mytest:

 2、清除编译后的无用文件:

问题一:为什么makefile对最新的可执行程序,默认不重新形成?

答:提高编译效率,对源代码进行简单更改甚至没有更改,再次编译全部全代码浪费资源

问题二:如何做到问题一?

答:对比可执行文件最近一次的修改时间和源文件最新的修改时间,前者大于后者就重编译

        touch源文件但是不对源文件进行修改也会更新源文件的修改时间,此时源文件的修改时间大于源文件此时可以再次make:

修改makefile后make指令无法执行成功的解决办法之一:

  • 查看可执行程序和源文件的修改时间
  • touch 源文件,再次执行make

~over~

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

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

相关文章

jmeter链路压测

比如登录后返回token,业务打印上传的操作需要用到token 线程组中添加登录请求,并执行 1、添加登录并执行,查看结果 2、结果树中下拉选择正则表达式,将token参数和值复制粘贴到下方,将token值改为(.*?)&#xff0…

关于第十二届蓝桥杯时间显示题中包和模块的使用解释

题目信息: 解题代码: from datetime import datetime, timedelta # 定义起始时间,即 Unix 时间戳的零点(1970年1月1日) start datetime(year1970, month1, day1) # 定义时间间隔,这里以毫秒为单位 dela …

js类型转换

类型转换只有这四种,例如如果要对象转数字,那么就需要先把对象转成原始类型,再从原始类型转到数字。 空数组转原始类型是一个空字符串。空对象转原始类型是[object Object]。 let a {} console.log(a);// NaN //等价于 a->原始 然后原始…

适用于 Linux 的 Windows 子系统安装初体验

1、简述 Windows Subsystem for Linux (WSL) 是 Windows 的一项功能,允许您在 Windows 计算机上运行 Linux 环境,而无需单独的虚拟机或双重启动。 WSL 旨在为想要同时使用 Windows 和 Linux 的开发人员提供无缝且高效的体验。 使用 WSL 安装和运行各种 L…

InternLM2-lesson2作业

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

四核8g服务器价格多少钱?

2024年腾讯云4核8G服务器租用优惠价格:轻量应用服务器4核8G12M带宽646元15个月,CVM云服务器S5实例优惠价格1437.24元买一年送3个月,腾讯云4核8G服务器活动页面 txybk.com/go/txy 活动链接打开如下图: 腾讯云4核8G服务器优惠价格 轻…

Doris实践——同程数科实时数仓建设

目录 前言 一、早期架构演进 二、Doris和Clickhouse选型对比 三、新一代统一实时数据仓库 四、基于Doris的一站式数据平台 4.1 一键生成任务脚本提升任务开发效率 4.2 自动调度监控保障任务正常运行 4.3 安全便捷的可视化查询分析 4.4 完备智能的集群监控 五、收益与…

基于单片机的无线红外报警系统

**单片机设计介绍,基于单片机的无线红外报警系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的无线红外报警系统是一种结合了单片机控制技术和无线红外传感技术的安防系统。该系统通过无线红外传感器实…

Excel、PowerQuery 和 ChatGPT 终极手册(下)

原文:Ultimate ChatGPT Handbook for Enterprises 译者:飞龙 协议:CC BY-NC-SA 4.0 使用 SUMIFS、SUMPRODUCT、AGGREGATE 和 MAX 函数查找数值数据 其中之一鲜为人知的事实是,当查找单个数值时,匹配和三角函数可能比查…

哈佛大学商业评论 -- 第二篇:增强现实是如何工作的?

AR将全面融入公司发展战略! AR将成为人类和机器之间的新接口! AR将成为人类的关键技术之一! 请将此文转发给您的老板! --- 本文作者:Michael E.Porter和James E.Heppelmann 虽然物理世界是三维的,但大…

视觉大模型--deter的深入理解

但对于transformer用于目标检测领域的开创性模型,该模型言简意赅,但是但从论文理解,有很多细节都不清楚,尤其是解码器的query和二分图匹配(Bipartite Matching)和匈牙利算法(Hungarian Algorithm)相关,本文将根据代码详…

Android自定义view;实现掌阅打开书籍动画效果

这里利用自定义view的方式来处理,初始化数据,camera通过setLocation调整相机的位置,但是Camera 的位置单位是英寸,英寸和像素的换算单位在 Skia 中被写成了72 像素,8 x 72 576,所以它的默认位置是 (0, 0, …

文件操作(详解)

该片博客有点长大家可以通过目录选择性阅读 这是个人主页 敲上瘾-CSDN博客 目录 1. 为什么使⽤⽂件? 2. 什么是⽂件? 2.1 程序⽂件 2.2 数据⽂件 2.3 ⽂件名 3. ⼆进制⽂件和⽂本⽂件? 4. ⽂件的打开和关闭 4.1 流和标准流 4.1.1 流…

Java 包装类初识泛型

登神长阶 第六阶 包装类&初识泛型 目录 😀一.包装类 😄1.基本数据类型以及其对应的包装类 😂2.装箱和拆箱 😇2.1.装箱(Boxing) 😉2.2.拆箱(Unboxing) &#x…

【项目技术介绍篇】若依项目代码文件结构介绍

作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过大学刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是&#xff0…

55 npm run serve 和 npm run build 的分包策略

前言 这里我们来看一下 vue 这边 打包的时候的一些 拆分包的一些策略 我们经常会使用到 npm run build 进行服务的打包 然后 打包出来的情况, 可能如下, 可以看到 chunk-vendors 是进行了包的拆分, 我们这里就是 来看一下 这里 npm run build 的时候的, 一个分包的策略 测试…

【Linux实验室】NFS、DHCP的搭建

NFS、DHCP的搭建 1、nfs服务搭建及测试什么是NFS?环境准备服务端机器安装nfs-utils和rpcbind包启动NFS服务创建/data/NFSdata目录,配置nfs文件启动服务挂载测试在服务端在共享目录下创建文件测试在客户端在共享目录下创建文件 2、dhcp服务搭建及测试什么…

如何保护IP地址不被泄露?

当互联网成为每个家庭的重要组成部分后,IP地址就成了你的虚拟地址。您的请求从该地址开始,然后 Internet 将消息发送回该地址。那么,您担心您的地址被泄露吗? 对于安全意识高或者某些业务需求的用户,如果您正在寻找保护…

element-ui empty 组件源码分享

今日简单分享 empty 组件的源码实现,主要从以下三个方面: 1、empty 组件页面结构 2、empty 组件属性 3、empty 组件 slot 一、empty 组件页面结构 二、empty 组件属性 2.1 image 属性,图片地址,类型 string,无默认…

Facebook轮播广告是什么?投放过程中有哪些需要注意的吗?

轮播广告是Facebook广告形式中的一种,可以把3—5个广告合并到一个可滚动的广告单元中。轮播广告会出现在新鲜事即News Feed中,是独立站卖家常用的一种广告形式 为什么选择轮播广告? 转化率更高:相较于单图广告,轮播广…