【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.背景知识
- 预处理(去注释,头文件展开,条件编译,宏替换)
- 编译(生成汇编)
- 汇编(生成机器可识别代码)
- 连接(生成可执行文件或库文件)
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 //依赖方法,怎么编译
相关文章:
【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.背景知识 预处理&am…...
sqlserver 子查询 =,in ,any,some,all的用法
在 SQL Server 中,子查询常用于嵌套在主查询中的子句中,以便根据子查询的结果集来过滤主查询的结果,或者作为主查询的一部分来计算结果。 以下是 、IN、ANY、SOME 和 ALL 运算符在子查询中的用法示例: 使用 运算符进行子查询&a…...
基于MapVGL的地理信息三维度数据增长可视化
写在前面 工作中接触,简单整理博文内容为 基于MapVGL的地理信息维度数据增长可视化 Demo理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都…...
天锐绿盾|防泄密系统|计算机文件数据\资料安全管理软件
“天锐绿盾”似乎是一款专注于防泄密和计算机文件数据/资料安全管理的软件。在信息安全日益受到重视的今天,这样的软件对于保护企业的核心数据资产和防止敏感信息泄露至关重要。 通用地址:www.drhchina.com 防泄密系统的主要功能通常包括: 文…...
leetcode刷题(罗马数字转数字)
1.题目描述 2.解题思路 这时候已经给出了字母对应的数字,我们只需要声明一个字典,将罗马数字和数字之间的对应关系声明即可。其中可能涉及到会出现两个连续的罗马字母代表一个数字,这时候我们需要判断遍历的字符和将要遍历的下一个字符是否存…...
什么是NAT网关?联通云NAT网关有什么优势
在当今云计算时代,网络安全和连接性是企业发展的关键因素之一。NAT网关(Network Address Translation Gateway)是一种网络设备,它可以在私有网络和公共网络之间进行地址转换,从而使得内部网络中的设备能够与外部网络进…...
CVE-2023-41892 漏洞复现
CVE-2023-41892 开题,是一个RCE Thanks for installing Craft CMS! You’re looking at the index.twig template file located in your templates/ folder. Once you’re ready to start building out your site’s front end, you can replace this with someth…...
【每日一题】06 排序链表
问题描述 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 求解 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* sortList(struct ListNode* head) {struct…...
【精品】关于枚举的高级用法
枚举父接口 public interface BaseEnum {Integer getCode();String getLabel();/*** 根据值获取枚举** param code* param clazz* return*/static <E extends Enum<E> & BaseEnum> E getEnumByCode(Integer code, Class<E> clazz) {Objects.requireNonN…...
Vue2学习第一天
Vue2 学习第一天 1. 什么是 vue? Vue 是一套用于构建用户界面的渐进式框架。 2. vue 历史 vue 是在 2013 年创建的,vue3 是 2020 出现的,现在主要是用 vue2,创新公司用的是 vue3 vue 的作者是尤雨溪,vue 的搜索热度比 react…...
HAL STM32通过multi_button库处理按键事件
HAL STM32通过multi_button库处理按键事件 📍作者:0x1abin的multi_button库:https://github.com/0x1abin/MultiButton 📘MultiButton简介 MultiButton 是一个小巧简单易用的事件驱动型按键驱动模块,可无限量扩展按键,…...
随机过程及应用学习笔记(一)概率论(概要)
概率是随机的基础,在【概率论(概要)】这个部分中仅记录学习随机过程及应用的基本定义和结果。 前言 首先,概率论研究的基础是概率空间。概率空间由一个样本空间和一个概率测度组成,样本空间包含了所有可能的结果&…...
洛谷_P1059 [NOIP2006 普及组] 明明的随机数_python写法
这道题的关键在于去重和排序,去重可以联想到集合,那排序直接使用sort方法。 n int(input()) data set(map(int,input().split( ))) data list(data) data.sort() print(len(data)) for i in data:print(i,end )...
爆火的人工智能开源open-interpreter源码解析
今天这篇文章带大家一起来阅读下github上爆火的开源项目 open-interpreter的源代码,相当于是一个可以本地部署的openai code-interpreter。 今天这期我们透过现象看本质,一起来剖析下他的源码。 体验open-interpreter的视频地址 open-interpreter&…...
POM设计模式思路,详解POM:概述与介绍,POM思路梳理+代码示例(全)
概述 在UI自动化测试中,POM模式是一种设计思路,它的核心思想是方法的封装。它将方法类和页面元素进行分离,增强了代码的可维护性。值得注意的是,这种分层的设计模式,最好也是从线性代码开始,逐步将代码进行…...
1、学习 Eureka 注册中心
学习 Eureka 注册中心 一、创建 Eureka 微服务0、SpringBoot 和 SpringCloud 版本1、引入 Eureka 服务端依赖2、启动类加 EnableEurekaServer 注解3、配置 yaml 文件,把 Eureka 服务注册到 Eureka 注册中心4、访问 Eureka 服务端,查看注册中心的服务列表…...
何为分账系统?
1、分账系统产生的背景 在数字化浪潮下第三方支付价值凸显,大大提升资金流与信息流流转效率,成为构建产业数字化重要枢纽。近年来,基于云计算、大数据、人工智能、物联网等技术积累,以第三方支付为切点的金融科技创新爆发着强大的…...
机器学习10-特征缩放
特征缩放的目的是确保不同特征的数值范围相近,使得模型在训练过程中更加稳定,加速模型收敛,提高模型性能。具体而言,零均值和单位方差的目标有以下几点好处: 1. 均值为零(Zero Mean):…...
Java基于微信小程序的医院挂号小程序,附源码
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
HarmonyOS一杯冰美式的时间 -- 验证码框
一、前言 像是短密码、验证码都有可能需要一个输入框,像是如下: 恰好在写HarmonyOS的时候也需要写一个验证码输入框,但是在实现的时候碰了几次灰,觉得有必要分享下,故有了此篇文章。 如果您有任何疑问、对文章写的不…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
