【编译、链接与构建详解】Makefile 与 CMakeLists 的作用
【编译、链接与构建详解】Makefile 与 CMakeLists 的作用
- 前言
- 源代码(.c、.cpp)
- 编译
- 编译的本质
- 编辑的结果
- 编译器(GCC、G++、NVCC 等)
- 目标文件(`.o`)
- 什么是 `.o` 目标文件
- 为什么单个 `.o` 目标文件不能直接执行?
- 链接
- 链接的本质
- 如果需要链接的 `.o` 文件很多且杂乱怎么办?
- 库文件(.a、.so)
- 静态库(`.a`)
- 动态库(`.so`)
- 构建
- 构建的步骤
- 自动化构建
- 构建工具与构建规则(Make、Makefile)
- 构建配置工具与构建配置文件(CMake、CMakeLists)
前言
在大型项目中,通常会使用 C 或 C++ 语言进行开发,而编译、链接、构建等概念,以及相关工具如 GCC、G++、NVCC、CMake、Make、Makefile 等,是每个开发者都无法绕过的重要内容。这些概念虽然至关重要,但往往容易混淆。因此,本文将简明扼要地介绍这些概念,帮助读者更深入地理解编译、链接与构建过程。
源代码(.c、.cpp)
我们编写的代码通常以 .c
或 .cpp
文件的形式存在,这些源代码文件是人类可读的,但计算机无法直接理解和执行。
计算机只能理解二进制的机器语言,因此,需要通过编译将源代码转换为机器可以识别的格式,这就涉及到编译的相关知识。
编译
编译的本质
程序员编写的 .c
和 .cpp
源代码是人类可读的,但计算机无法直接理解。为了让计算机执行这些代码,需要将其转换为计算机能够识别的二进制语言,这个过程就是编译的本质。
编辑的结果
编译的结果是目标文件(.o
文件),它包含了经过翻译但尚未完整链接的二进制代码(机器可以理解的语言)。理解目标文件的作用,有助于更深入地掌握编译过程。
编译器(GCC、G++、NVCC 等)
编译器是将源代码翻译为计算机能够理解的目标文件的“翻译官”。它负责将人类编写的 .c
、.cpp
、.cu
等源代码转化为机器可执行的二进制代码。常见的编译器包括:
- GCC(GNU Compiler Collection):主要用于编译 C 语言的源代码(
.c
文件)。 - G++:是 GCC 的 C++ 编译器,用于编译 C++ 语言的源代码(
.cpp
文件)。 - NVCC:NVIDIA CUDA 编译器,用于编译并行计算的 CUDA 程序(
.cu
文件)。
这些编译器各自对应不同类型的源代码文件,执行代码翻译的任务。
目标文件(.o
)
什么是 .o
目标文件
.c
和 .cpp
源代码经过编译后,会生成 .o
目标文件。目标文件是计算机可以理解的二进制代码,意味着源代码已经被翻译成机器语言,程序的执行又向前迈进了一步。
为什么单个 .o
目标文件不能直接执行?
目标文件(.o
)本身并不能直接运行,因为它只是编译后的中间产物,尚未构成完整的可执行程序。通常,一个程序由多个 .c
或 .cpp
文件组成,而 main
函数往往位于其中的一个文件中,负责调用其他模块的函数。
可以将程序比作一辆汽车:main
函数相当于车架,而各个 .o
文件代表轮子、方向盘、控制台等组件。单独的 .o
文件只是一个零件,只有经过链接,将所有模块正确拼接在一起,才能形成最终可运行的程序。
要将这些独立的目标文件整合成一个可执行程序,就涉及到链接的过程。
链接
链接的本质
当所有 .c
或 .cpp
代码经过编译后,都会生成 .o
目标文件。这些 .o
文件虽然已经被翻译成机器可以识别的语言,但它们彼此独立,尚无法直接运行。
链接就是组装:
可以将 .o
文件比作汽车的零部件:单独的目标文件就像轮子、方向盘、发动机等组件,只有经过链接,将这些部件正确组装起来,才能形成一个完整的可执行程序(拼成一个可以跑的汽车)。链接的本质,就是将多个 .o
目标文件整合在一起,最终拼接成可以运行的可执行文件。
通常,在所有被链接的 .o
目标文件中,只有一个包含 main
主函数,它相当于汽车的车架,而其他 .o
文件则封装了各种功能模块(如发动机、刹车系统、座椅等)。链接的过程,就是将这个带有 main
入口的*“车架”与其他“零部件”*拼接在一起,使其成为一个完整可运行的程序。
如果需要链接的 .o
文件很多且杂乱怎么办?
在大型项目中,编译过程中会生成大量 .o
目标文件。如果直接链接所有 .o
文件,不仅会导致项目结构混乱,还会增加管理和分发的难度。
为了解决这个问题,通常会将多个 .o
文件打包成库文件,即 .so
(动态/共享库) 和 .a
(静态库)。这些库文件可以帮助我们更高效地组织、管理和复用代码,使项目结构更加清晰,链接过程也更加简洁。
库文件(.a、.so)
为了更方便地管理大量的 .o
目标文件,引入了库文件的概念。库文件可以看作是多个 .o
文件的集合,用于提高代码的组织性和复用性。然而,库文件分为两种类型:
.a
(静态库).so
(动态库/共享库)
二者虽然都是 .o
文件的集合,但在使用方式上存在明显区别。
静态库(.a
)
静态库(.a
)本质上是多个 .o
目标文件的打包集合,在编译时会被直接链接到可执行文件中。这种方式可以提高代码复用性,并减少每次编译时重复编写相同代码的工作量。
然而,静态库是固定的,如果库中的 .o
文件对应的源代码发生修改,就需要重新编译修改的部分并更新静态库文件,然后再重新链接生成新的可执行文件。这意味着每次库文件更新后,所有依赖该库的程序都必须重新编译和链接。
动态库(.so
)
动态库(.so
,共享库)与静态库类似,也是多个 .o
目标文件的集合,但它不会在编译时直接嵌入可执行文件,而是在程序运行时被加载。这种方式减少了可执行文件的体积,并允许多个程序共享同一个库,从而提高资源利用率。
此外,动态库是灵活的,如果库中的 .o
文件对应的源代码发生修改,只需重新编译动态库文件,无需重新编译和链接所有依赖它的程序。程序在运行时会自动加载最新版本的动态库,因此更新更加便捷。
构建
构建是将源代码转化为可执行文件的完整过程,通常包括以下几个主要步骤:
构建的步骤
-
清理
在进行新一轮构建之前,需要先清理掉之前构建的产物,比如删除旧的目标文件.o
、可执行文件和库文件等。这一步确保构建环境干净,避免旧文件影响新一轮构建。 -
管理依赖
项目可能依赖外部库或资源,这时候需要下载、安装并管理这些依赖,确保它们的版本正确且可用。 -
编译
这一阶段将源代码文件(.c
或.cpp
)编译成目标文件(.o
)。编译过程将人类可读的代码转化为机器可以理解的中间产物。 -
链接
链接过程将多个目标文件(.o
文件)和库文件(.a
或.so
文件)整合、拼接成一个完整的可执行文件,最终生成可以运行的程序。 -
其他
在某些构建过程中,还可能涉及其他步骤,如单元测试、部署、打包等,这些步骤根据项目需求可能会有所不同。
自动化构建
如上所述,构建过程包含多个环节,涉及到源代码的编译、目标文件的生成、依赖的管理等操作。为了实现高效且自动化的构建,通常会使用构建工具来控制这一过程。
最常见的构建工具是 Make,它通过 Makefile 文件定义的构建规则和依赖关系,从而自动化管理和执行构建步骤。接下来,我们将介绍 Make 工具及其 Makefile 构建规则的相关内容。
构建工具与构建规则(Make、Makefile)
Make 是一种常用的构建工具,它根据 Makefile 中定义的 构建规则 来自动化构建过程。Makefile 中指定了构建目标、依赖关系、编译器选项、可执行文件名等具体的构建命令。
然而,Make 的一些局限性也较为明显:它的语法较为底层,可读性较差,并且对多平台兼容性较弱(例如,它通常只适用于 UNIX 系统,而在其他平台的构建可能会遇到困难)。
为了克服这些问题,CMake 应运而生。CMake 是一个更高级的构建配置工具,它通过平台无关的配置文件生成适用于不同平台的构建文件(例如 Makefile 或 Visual Studio 工程文件),从而解决了多平台兼容性和可读性差的问题。
构建配置工具与构建配置文件(CMake、CMakeLists)
正如前文所述,CMake 是一个高级的构建配置工具,它通过读取 CMakeLists.txt 文件中定义的构建配置来生成适应不同平台的构建规则。CMake 会根据 CMakeLists.txt 中的内容,自动生成对应的构建文件(例如 Makefile 或 Visual Studio 工程文件),然后调用相应的构建工具(如 make
)来执行构建过程。
相较于 Make,CMake 提供了更高层次的抽象,具有更强的实用性和更好的跨平台兼容性。因此,CMake 在大型项目中得到了更广泛的应用,尤其是在需要支持多平台构建时,CMake 和 CMakeLists.txt 文件成为了主流的选择。
相关文章:
【编译、链接与构建详解】Makefile 与 CMakeLists 的作用
【编译、链接与构建详解】Makefile 与 CMakeLists 的作用 前言源代码(.c、.cpp)编译编译的本质编辑的结果编译器(GCC、G、NVCC 等) 目标文件(.o)什么是 .o 目标文件为什么单个 .o 目标文件不能直接执行&…...
Oracle 数据库系统全面详解
Oracle 数据库是全球领先的关系型数据库管理系统(RDBMS),由 Oracle 公司开发。它为企业级应用提供了高性能、高可用性、安全性和可扩展性的数据管理解决方案。 目录 一、Oracle 数据库体系结构 1. 物理存储结构 主要组件: 存储层次: 2. …...
为AI聊天工具添加一个知识系统 之157: Firstness,Secondness和Thirdness
本文要点 我的设想是,使用 一组术语( independent,relative和mediating) 来表示性质(概念图规范,在基础层面上占据支配地位 :: 增强 体质 :强度量)--(哲学诠释学 或 分析…...
MapReduce 的工作原理
MapReduce 是一种分布式计算框架,用于处理和生成大规模数据集。它将任务分为两个主要阶段:Map 阶段和 Reduce 阶段。开发人员可以使用存储在 HDFS 中的数据,编写 Hadoop 的 MapReduce 任务,从而实现并行处理1。 MapReduce 的工作…...
树莓派 —— 在树莓派4b板卡下编译FFmpeg源码,支持硬件编解码器(mmal或openMax硬编解码加速)
🔔 FFmpeg 相关音视频技术、疑难杂症文章合集(掌握后可自封大侠 ⓿_⓿)(记得收藏,持续更新中…) 正文 1、准备工作 (1)树莓派烧录RaspberryPi系统 (2)树莓派配置固定IP(文末) (3)xshell连接树莓派 (4)...
PHP回调后门
1.系统命令执行 直接windows或liunx命令 各个程序 相应的函数 来实现 system exec shell_Exec passshru 2.执行代码 eval assert php代码 系统 <?php eval($_POST) <?php assert($_POST) 简单的测试 回调后门函数call_user_func(1,2) 1是回调的函数 2是回调…...
Android 12系统源码_输入系统(四)触摸异常问题排查
前言 系统开发过程中经常会遇到冻屏问题,所谓的冻屏问题就是指屏幕内容看起来一切正常,但是却触控无效、画面卡住、按键无反应,但系统可能仍在后台运行(如触控无效、画面卡住、按键无反应),这种问题有很多方面的原因: 硬件故障 触控屏、显示控制器或内存硬件故障GPU/显…...
Java 大视界 -- 基于 Java 的大数据可视化在城市规划决策支持中的交互设计与应用案例(164)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
【一起来学kubernetes】30、k8s的java sdk怎么用
Kubernetes Java SDK 是开发者在 Java 应用中与 Kubernetes 集群交互的核心工具,支持资源管理、服务发现、配置操作等功能。 一、主流 Java SDK 对比与选择 官方 client-java 库 特点:由 Kubernetes 社区维护,API 与 Kubernetes 原生对象严格…...
T11 TensorFlow入门实战——优化器对比实验
🍨 本文為🔗365天深度學習訓練營 中的學習紀錄博客🍖 原作者:K同学啊 | 接輔導、項目定制 一、前期准备 1. 导入数据 # Import the required libraries import pathlib import matplotlib.pyplot as plt import tensorflow as t…...
Vue React
Vue 的源码主要分为以下几个部分: 主要涉及 响应式、虚拟 DOM、组件系统、编译器、运行时。 ├── packages/ │ ├── compiler-core/ # 编译器核心 │ ├── compiler-sfc/ # 处理 .vue 单文件组件 │ ├── compiler-dom/ # 处理 DOM 相关…...
分布式环境下的主从数据同步
目录 1. 数据同步的推/拉方式 1.1 主节点推送 1.2 从节点拉取 1.3 常见组件的推拉方式 2.复制方式 2.1 同步复制 2.2 异步复制 2.3 半同步复制 2.4 常见组件的同步方式 3.日志格式 3.1 基于语句复制 SBR 3.2 基于行复制 RBR 3.3 基于预写日志 WAL 3.4 基于触发器…...
C#:字符串插值(String Interpolation)
目录 起点:编程的基本需求 推导:如何让字符串更“聪明”? 什么是 C# 中的字符串插值? 为什么需要字符串插值? 什么时候用字符串插值? 插值的工作原理 总结 起点:编程的基本需求 程序需要…...
Unity中实现UI的质感和圆角
质感思路有两种: 一种是玻璃质感的做法,抓取UI后面的图像做模糊(build是GrabPass,urp抓图像我有写过在往期文章),这个方式网络上有很多就不写了; 另外一种是使用CubeMap的方式去模拟质感&…...
【蓝桥杯】 枚举和模拟练习题
系列文章目录 蓝桥杯例题 枚举和模拟 文章目录 系列文章目录前言一、好数: 题目参考:核心思想:代码实现: 二、艺术与篮球: 题目参考:核心思想:代码实现: 总结 前言 今天距离蓝桥杯还有13天&…...
【设计模式】适配器模式
适配器模式像是一个“接口转换器”,让两个不兼容的接口能够协同工作。比如 Type-C 转 3.5mm 耳机口的转换器,让新手机能用旧耳机。 代码实现 // 1. 旧款圆口充电器(被适配者) class RoundHoleCharger {public int getRoundHoleV…...
【NLP 面经 3】
目录 一、Transformer与RNN对比 多头自注意力机制工作原理 相比传统 RNN 在处理长序列文本的优势 应对过拟合的改进方面 二、文本分类任务高维稀疏文本效果不佳 特征工程方面 核函数选择方面 模型参数调整方面 三、NER中,RNN模型效果不佳 模型架构方面 数据处理方面…...
区间预测 | MATLAB实现QRBiGRU门控循环单元分位数回归时间序列区间预测
区间预测 | MATLAB实现QRBiGRU门控循环单元分位数回归时间序列区间预测 目录 区间预测 | MATLAB实现QRBiGRU门控循环单元分位数回归时间序列区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 区间预测 | MATLAB实现QRBiGRU门控循环单元分位数回归时间序列区…...
Github 热点项目 awesome-mcp-servers MCP 服务器合集,3分钟实现AI模型自由操控万物!
【今日推荐】超强AI工具库"awesome-mcp-servers"星数破万! ① 百宝箱式服务模块:AI能直接操作浏览器、读文件、连数据库,比如让AI助手自动整理Excel表格,三分钟搞定全天报表; ② 跨领域实战利器:…...
深入理解 YUV 颜色空间:从原理到 Android 视频渲染
在视频处理和图像渲染领域,YUV 颜色空间被广泛用于压缩和传输视频数据。然而,在实际开发过程中,很多开发者会遇到 YUV 颜色偏色 的问题,例如 画面整体偏绿。这通常与 U、V 分量的取值有关。那么,YUV 颜色是如何转换为 …...
Qt中绘制不规则控件
在Qt中绘制不规则控件可通过设置遮罩(Mask)实现。以下是详细步骤: 继承目标控件:如QPushButton或QWidget。重写resizeEvent:当控件大小变化时,更新遮罩形状。创建遮罩区域:使用QRegion或QPain…...
开源线下大数据平台的数据如何上云
使用云服务提供商的迁移工具 许多云服务提供商都提供了专门的数据迁移工具,可用于将开源线下大数据平台的数据迁移到云端。以亚马逊云服务(AWS)为例,其提供的 AWS Snowball 是一种边缘计算设备,可以用于大规模数据的离…...
【doris】Apache Doris简介
目录 1. 概述2. 技术特点2.1 高性能查询2.2 实时数据导入2.3 易于使用2.4 高可扩展性2.5 数据模型2.6 容错性 3. 适用场景4. 部署与架构4.1 部署方式4.2 架构特点 5. 优势 1. 概述 1.Apache Doris(原名Palo)最早诞生于百度广告报表业务,2017…...
在MFC中使用Qt(六):深入了解QMfcApp
前言 此前系列文章回顾: 在MFC中使用Qt(一):玩腻了MFC,试试在MFC中使用Qt!(手动配置编译Qt) 在MFC中使用Qt(二):实现Qt文件的自动编译流程 在M…...
JWT在线解密/JWT在线解码 - 加菲工具
JWT在线解密/JWT在线解码 首先进入加菲工具 选择 “JWT 在线解密/解码” https://www.orcc.top 或者直接进入JWT 在线解密/解码 https://www.orcc.top/tools/jwt 进入功能页面 使用 输入对应的jwt内容,点击解码按钮即可...
【机器学习】——机器学习思考总结
摘要 这篇文章深入探讨了机器学习中的数据相关问题,重点分析了神经网络(DNN)的学习机制,包括层级特征提取、非线性激活函数、反向传播和梯度下降等关键机制。同时,文章还讨论了数据集大小的标准、机器学习训练数据量的…...
高效定位 Go 应用问题:Go 可观测性功能深度解析
作者:古琦 背景 自 2024 年 6 月 26 日,阿里云 ARMS 团队正式推出面向 Go 应用的可观测性监控功能以来,我们与程序语言及编译器团队携手并进,持续深耕技术优化与功能拓展。这一创新性的解决方案旨在为开发者提供更为全面、深入且…...
emWin图片旋转
图片取模: //emwin6.16 //正常绘制 hMem0 GUI_MEMDEV_Create(0, 0, bmPHPH.XSize, bmPHPH.YSize); hMem1 GUI_MEMDEV_Create(0, 0, bmPHPH.XSize, bmPHPH.YSize); //正常绘制 hMem0 GUI_MEMDEV_CreateFixed32 (0,0, bmPHPH.XSize, bmPHPH.YSize); hMem1 GUI_M…...
CSS 父类元素的伪类 选择器
父元素的 :hover 状态可以影响子元素的样式。当父元素处于 :hover 状态时,可以通过 CSS 的选择器为子元素设置样式。 .parent:hover .child 这种选择器叫做 后代选择器(Descendant Selector) ,结合了 :hover 伪类。它的作用是&…...
【Spring Boot 与 Spring Cloud 深度 Mape 之三】服务注册与发现:Nacos 核心实战与原理浅析
【Spring Boot 与 Spring Cloud 深度 Mape 之三】服务注册与发现:Nacos 核心实战与原理浅析 #SpringCloudAlibaba #Nacos #服务注册 #服务发现 #服务治理 #微服务 #SpringBoot #Java 系列衔接:在前两篇 [【深度 Mape 之一】 和 [【深度 Mape 之二】] 中…...
JS实现动态点图酷炫效果
实现目标 分析问题 整个图主要是用canvas实现,其中难点是将线的长度控制在一定范围内、并且透明度随长度变化。 前置知识 canvas绘制点、线、三角形、弧形 // 点ctx.moveTo(this.x, this.y);ctx.arc(this.x, this.y, this.r,0, 2 * Math.PI, false);ctx.fillStyle …...
使用ModbusRTU读取松下测高仪的高度
使用C#通过Modbus RTU读取松下测高仪高度 1. 准备工作 1.1 硬件连接 确保松下测高仪支持Modbus RTU协议(需查阅设备手册确认)。通过RS-485或RS-232接口连接设备与计算机,可能需要USB转串口适配器。确认通信参数(波特率、数据位、停止位、奇偶校验),常见设置为:9600波特…...
SQL Server从安装到入门一文掌握应用能力。
本篇文章主要讲解,SQL Server的安装教程及入门使用的基础知识,通过本篇文章你可以快速掌握SQL Server的建库、建表、增加、查询、删除、修改等基本数据库操作能力。 作者:任聪聪 日期:2025年3月31日 一、SQL Server 介绍: SQL Server 是微软旗下的一款主流且优质的数据库…...
Ubuntu上给AndroidStudio创建桌面图标
最近使用了Ubuntu开发了,默认的android studio没有桌面图标,还是很不方便,每次都要cd到bin目录启动studio.sh。 步骤1:cd /usr/share/applications linux系统里面,所有的应用启动入口都在 /usr/share/applications …...
HarmonyOS:ComposeTitleBar 组件自学指南
在日常的鸿蒙应用开发工作中,我们常常会面临构建美观且功能实用的用户界面的挑战。而标题栏作为应用界面的重要组成部分,它不仅承载着展示页面关键信息的重任,还能为用户提供便捷的操作入口。最近在参与的一个项目里,我就深深体会…...
C# System.Net.Dns 使用详解
总目录 前言 在网络编程中,域名系统(DNS)是互联网的核心组成部分之一,它将人类可读的域名转换为机器可用的IP地址。在.NET框架中,System.Net.Dns类提供了一组静态方法,用于执行与DNS相关的操作。本文将详细…...
Spring-事务属性
1.隔离属性 数据库对于隔离属性的支持 隔离属性的值MySQLOracle ISOLATION.READ_COMMITTED √ √ ISOLATION.REPEATABLE_READ√ISOLATION.SERIALIZABLE√√ Oracle不支持REPEATABLE_READ值 如何解决不可重复度 采用的多版本比对的方式 解决不可重复读 默认隔离属性 ISO…...
“上云入端” 浪潮云剑指组织智能化落地“最后一公里”
进入2025年,行业智能体正在成为数实融合的核心路径。2025年初DeepSeek开源大模型的横空出世,通过算法优化与架构创新,显著降低算力需求与部署成本,推动大模型向端侧和边缘侧延伸。其开源策略打破技术垄断,结合边缘计算…...
Docker 的实质作用是什么
Docker 的实质作用是什么 目录 Docker 的实质作用是什么**1. Docker 的实质作用****2. 为什么使用 Docker?****(1)解决环境一致性问题****(2)提升资源利用率****(3)简化部署与扩展****(4)加速开发与协作****3. 举例说明****总结**Docker 的实质是容器化平台,核心作用…...
WEB安全--文件上传漏洞--白名单绕过
一、MIME类型(Content-Type)绕过 原理:在我们不能绕过白名单后缀限制时,如果后端检测的是文件类型(数据包中的Content-Type字段),那我们可以利用合法类型替换 示例:在上传,php后缀…...
Mac 本地化部署 dify
Macbook 本地化部署 dify 目录 Macbook 本地化部署 dify安装dockerdocker下载地址 安装dify下载dify到本地github可能遇到的问题: github打开超时在本地解压dify.zip文件本地化部署docker部署可能遇到的问题: 部署超时登录体验 dify 安装docker docker下载地址 根据电脑芯片选…...
MySQL和navicat日常使用记录
navicat界面上之前跟localhost连接的数据库可以直接点开了 这里有excel导入的地方 然后添加文件,选则文件是哪个,勾选excel的表是哪个,根据实际情况定义一些附加选项,注意时间格式,下一步下一步,然后选择主…...
linux进程信号 ─── linux第27课
在 Linux 系统中,信号(Signals) 是一种进程间通信(IPC)机制,用于通知进程发生了某种事件或请求进程执行特定操作。 你怎么能识别信号呢?识别信号是内置的,进程识别信号,是…...
云安全之k8s未授权漏洞总结
一、k8s介绍 全称是 kubernetes,是谷歌在2014年推出的一种开源容器编排系统,后来捐赠给了云原生计算基金会(CNCF)。因将k后面的8个字母进行缩写后,被广泛简称为K8s。随着容器技术的发展,面临着容器数量庞大…...
博客学术汇测试报告
Author:MTingle major:人工智能 Build your hopes like a tower! 目录 一.项目简介 二.开发技术 三.测试用例设计 四.自动化测试代码 common包 博客编辑 博客列表 登录页面 未登录测试 主函数 五.性能测试 六.测试总结 一.项目简介 该项目是一款基于 S…...
揭秘:父子组件之间的传递
基础知识 组件与组件之间有三大方面的知识点: 子组件通过props defineProps({})接收父组件传递到参数和方法;子组件可以通过定义 emit 事件,向父组件发送事件;父组件调用子组件通过defineExpose 导出的方法…...
leetcode 169.Majority Element
这道题虽然简单,但适合用来练习各种解法。《剑指offer》5.2节 面试题29与此题一样,并且给出了leetcode官方题解未给出的快速选择的解法。 方法一、用哈希表解决 class Solution { public:int majorityElement(vector<int>& nums) {unordered…...
魔改chromium——基础环境搭建
谷歌chromium环境要求详细文档 软件和环境要求,必须安装,硬性要求 系统环境:Windows 10,内存最小8GB,推荐16GB,NTFS格式磁盘最少100GB空间Git版本:安装最新版本即可,Git桌面端下载…...
[网络_1] 因特网 | 三种交换 | 拥塞 | 差错 | 流量控制
目录 一、网络、互连网与因特网 二、因特网发展 三、因特网的组成与功能 四、计算机网络的分类 五、因特网的标准化与意义 一、三种传输方式:电路交换 vs 报文交换 vs 分组交换 1. 电路交换(Circuit Switching)——像“打电话” 2. 报…...
android 何如查找内网设备 IP
前沿 最近在与嵌入式设备打交道,需要对设备进行配网。发现 UpnP 服务不稳定,经常收不到设备的信息。就想着能不能通过内网查找到 IP 后,直接与设备通信,不停的请求设备信息。 1.Android 端通过 UDP 组播(Multicast)查找设备 如果嵌入式设备支持 UDP 组播,Android 端可…...