【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的时候也需要写一个验证码输入框,但是在实现的时候碰了几次灰,觉得有必要分享下,故有了此篇文章。 如果您有任何疑问、对文章写的不…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
k8s从入门到放弃之HPA控制器
k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...