【Make编译控制 06】CMake初步使用

news2024/11/22 19:44:40

目录

一、概述与安装

二、编译源文件

三、无关文件管理


一、概述与安装

CMake是一个跨平台的项目构建工具,相比于Makefile,CMake更加高级,因为CMake代码在执行的时候是会先翻译生成Makefile文件,再调用Makefile文件完成项目构建,这就像是高级语言和低级语言之间的关系。

Makefile虽然也支持在不同的平台上运行,但是不同平台上进行项目构建的Makefile代码是不一样的,也就是说不具备Makefile代码不具备跨平台性,所以CMake的出现便是帮Makefile解决了这个问题,因为CMake可以根据不同的平台生成不同的Makefile文件。

Linux系统CMake直接命令行安装:yum install -y cmake

Windows系统CMake安装地址:https://cmake.org/files/

选择对应版本的 x86_64.msi 文件下载运行,安装的时候选择添加系统环境变量:

# 在PowerShell上检查是否安装成功

PS C:\Users\pheonixFly> cmake --version
cmake version 3.28.0-rc1

CMake suite maintained and supported by Kitware (kitware.com/cmake).
PS C:\Users\pheonixFly>

二、编译源文件

// add.h

#pragma once
int add(int a, int b);
// sub.h

#pragma once
int sub(int a, int b);
// add.cpp

#include "add.h"

int add(int a, int b) {
    return a + b;
}
// add.cpp

#include "sub.h"

int sub(int a, int b) {
    return a - b;
}
# CMakeLists.txt 文件代码

cmake_minimum_required(VERSION 2.8)
# 指定使用的 cmake 的最低版本
# 可选,非必须,如果不加可能会有警告

project(MATH)
# 定义工程名称,
# 并可指定工程的版本、工程描述、web主页地址、支持的语言(默认情况支持所有语言),
# 如果不需要这些都是可以忽略的,只需要指定出工程名字即可。

add_executable(math.exe add.cpp sub.cpp main.cpp)
# add_executable(可执行程序名 源文件名称)
# 定义工程会生成一个可执行程序
# 源文件名可以是一个也可以是多个,如有多个可用空格或分号间隔
# 执行 cmake . 命令,生成 Makefile 文件
# 执行新生成的 Makefile 文件

(base) [root@localhost 10_test]# tree .
.
├── add.cpp
├── add.h
├── CMakeLists.txt
├── main.cpp
├── sub.cpp
└── sub.h

0 directories, 6 files
(base) [root@localhost 10_test]# cmake .
-- The C compiler identification is GNU 4.8.5
-- The CXX compiler identification is GNU 4.8.5
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /root/gitee/Test/Make_Learn/10_test
(base) [root@localhost 10_test]# tree .
.
├── add.cpp
├── add.h
├── CMakeCache.txt
├── CMakeFiles
│   ├── 2.8.12.2
│   │   ├── CMakeCCompiler.cmake
│   │   ├── CMakeCXXCompiler.cmake
│   │   ├── CMakeDetermineCompilerABI_C.bin
│   │   ├── CMakeDetermineCompilerABI_CXX.bin
│   │   ├── CMakeSystem.cmake
│   │   ├── CompilerIdC
│   │   │   ├── a.out
│   │   │   └── CMakeCCompilerId.c
│   │   └── CompilerIdCXX
│   │       ├── a.out
│   │       └── CMakeCXXCompilerId.cpp
│   ├── cmake.check_cache
│   ├── CMakeDirectoryInformation.cmake
│   ├── CMakeOutput.log
│   ├── CMakeTmp
│   ├── Makefile2
│   ├── Makefile.cmake
│   ├── math.exe.dir
│   │   ├── build.make
│   │   ├── cmake_clean.cmake
│   │   ├── DependInfo.cmake
│   │   ├── depend.make
│   │   ├── flags.make
│   │   ├── link.txt
│   │   └── progress.make
│   ├── progress.marks
│   └── TargetDirectories.txt
├── cmake_install.cmake
├── CMakeLists.txt
├── main.cpp
├── Makefile         ################ 新生成的 Makefile 文件       
├── sub.cpp
└── sub.h

6 directories, 32 files
(base) [root@localhost 10_test]# make
Scanning dependencies of target math.exe
[ 33%] Building CXX object CMakeFiles/math.exe.dir/add.cpp.o
[ 66%] Building CXX object CMakeFiles/math.exe.dir/sub.cpp.o
[100%] Building CXX object CMakeFiles/math.exe.dir/main.cpp.o
Linking CXX executable math.exe
[100%] Built target math.exe
(base) [root@localhost 10_test]# tree .
.
├── add.cpp
├── add.h
├── CMakeCache.txt
├── CMakeFiles
│   ├── 2.8.12.2
│   │   ├── CMakeCCompiler.cmake
│   │   ├── CMakeCXXCompiler.cmake
│   │   ├── CMakeDetermineCompilerABI_C.bin
│   │   ├── CMakeDetermineCompilerABI_CXX.bin
│   │   ├── CMakeSystem.cmake
│   │   ├── CompilerIdC
│   │   │   ├── a.out
│   │   │   └── CMakeCCompilerId.c
│   │   └── CompilerIdCXX
│   │       ├── a.out
│   │       └── CMakeCXXCompilerId.cpp
│   ├── cmake.check_cache
│   ├── CMakeDirectoryInformation.cmake
│   ├── CMakeOutput.log
│   ├── CMakeTmp
│   ├── Makefile2
│   ├── Makefile.cmake
│   ├── math.exe.dir
│   │   ├── add.cpp.o
│   │   ├── build.make
│   │   ├── cmake_clean.cmake
│   │   ├── CXX.includecache
│   │   ├── DependInfo.cmake
│   │   ├── depend.internal
│   │   ├── depend.make
│   │   ├── flags.make
│   │   ├── link.txt
│   │   ├── main.cpp.o
│   │   ├── progress.make
│   │   └── sub.cpp.o
│   ├── progress.marks
│   └── TargetDirectories.txt
├── cmake_install.cmake
├── CMakeLists.txt
├── main.cpp
├── Makefile         ################ 新生成的 Makefile 文件
├── math.exe         ################ 新生成的 math.exe 文件
├── sub.cpp
└── sub.h

6 directories, 38 files
(base) [root@localhost 10_test]# ./math.exe
10 + 5 = 15
10 - 5 = 5
(base) [root@localhost 10_test]# 
# CMake 生成的 Makefile 文件代码

# CMAKE generated file: DO NOT EDIT!
# Generated by "Unix Makefiles" Generator, CMake Version 2.8

# Default target executed when no arguments are given to make.
default_target: all
.PHONY : default_target

#=============================================================================
# Special targets provided by cmake.

# Disable implicit rules so canonical targets will work.
.SUFFIXES:

# Remove some rules from gmake that .SUFFIXES does not remove.
SUFFIXES =

.SUFFIXES: .hpux_make_needs_suffix_list

# Suppress display of executed commands.
$(VERBOSE).SILENT:

# A target that is always out of date.
cmake_force:
.PHONY : cmake_force

#=============================================================================
# Set environment variables for the build.

# The shell in which to execute make rules.
SHELL = /bin/sh

# The CMake executable.
CMAKE_COMMAND = /usr/bin/cmake

# The command to remove a file.
RM = /usr/bin/cmake -E remove -f

# Escaping for special characters.
EQUALS = =

# The program to use to edit the cache.
CMAKE_EDIT_COMMAND = /usr/bin/ccmake

# The top-level source directory on which CMake was run.
CMAKE_SOURCE_DIR = /root/gitee/Test/Make_Learn/10_test

# The top-level build directory on which CMake was run.
CMAKE_BINARY_DIR = /root/gitee/Test/Make_Learn/10_test

#=============================================================================
# Targets provided globally by CMake.

# Special rule for the target edit_cache
edit_cache:
	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake cache editor..."
	/usr/bin/ccmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
.PHONY : edit_cache

# Special rule for the target edit_cache
edit_cache/fast: edit_cache
.PHONY : edit_cache/fast

# Special rule for the target rebuild_cache
rebuild_cache:
	@$(CMAKE_COMMAND) -E cmake_echo_color --switch=$(COLOR) --cyan "Running CMake to regenerate build system..."
	/usr/bin/cmake -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR)
.PHONY : rebuild_cache

# Special rule for the target rebuild_cache
rebuild_cache/fast: rebuild_cache
.PHONY : rebuild_cache/fast

# The main all target
all: cmake_check_build_system
	$(CMAKE_COMMAND) -E cmake_progress_start /root/gitee/Test/Make_Learn/10_test/CMakeFiles /root/gitee/Test/Make_Learn/10_test/CMakeFiles/progress.marks
	$(MAKE) -f CMakeFiles/Makefile2 all
	$(CMAKE_COMMAND) -E cmake_progress_start /root/gitee/Test/Make_Learn/10_test/CMakeFiles 0
.PHONY : all

# The main clean target
clean:
	$(MAKE) -f CMakeFiles/Makefile2 clean
.PHONY : clean

# The main clean target
clean/fast: clean
.PHONY : clean/fast

# Prepare targets for installation.
preinstall: all
	$(MAKE) -f CMakeFiles/Makefile2 preinstall
.PHONY : preinstall

# Prepare targets for installation.
preinstall/fast:
	$(MAKE) -f CMakeFiles/Makefile2 preinstall
.PHONY : preinstall/fast

# clear depends
depend:
	$(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1
.PHONY : depend

#=============================================================================
# Target rules for targets named math.exe

# Build rule for target.
math.exe: cmake_check_build_system
	$(MAKE) -f CMakeFiles/Makefile2 math.exe
.PHONY : math.exe

# fast build rule for target.
math.exe/fast:
	$(MAKE) -f CMakeFiles/math.exe.dir/build.make CMakeFiles/math.exe.dir/build
.PHONY : math.exe/fast

add.o: add.cpp.o
.PHONY : add.o

# target to build an object file
add.cpp.o:
	$(MAKE) -f CMakeFiles/math.exe.dir/build.make CMakeFiles/math.exe.dir/add.cpp.o
.PHONY : add.cpp.o

add.i: add.cpp.i
.PHONY : add.i

# target to preprocess a source file
add.cpp.i:
	$(MAKE) -f CMakeFiles/math.exe.dir/build.make CMakeFiles/math.exe.dir/add.cpp.i
.PHONY : add.cpp.i

add.s: add.cpp.s
.PHONY : add.s

# target to generate assembly for a file
add.cpp.s:
	$(MAKE) -f CMakeFiles/math.exe.dir/build.make CMakeFiles/math.exe.dir/add.cpp.s
.PHONY : add.cpp.s

main.o: main.cpp.o
.PHONY : main.o

# target to build an object file
main.cpp.o:
	$(MAKE) -f CMakeFiles/math.exe.dir/build.make CMakeFiles/math.exe.dir/main.cpp.o
.PHONY : main.cpp.o

main.i: main.cpp.i
.PHONY : main.i

# target to preprocess a source file
main.cpp.i:
	$(MAKE) -f CMakeFiles/math.exe.dir/build.make CMakeFiles/math.exe.dir/main.cpp.i
.PHONY : main.cpp.i

main.s: main.cpp.s
.PHONY : main.s

# target to generate assembly for a file
main.cpp.s:
	$(MAKE) -f CMakeFiles/math.exe.dir/build.make CMakeFiles/math.exe.dir/main.cpp.s
.PHONY : main.cpp.s

sub.o: sub.cpp.o
.PHONY : sub.o

# target to build an object file
sub.cpp.o:
	$(MAKE) -f CMakeFiles/math.exe.dir/build.make CMakeFiles/math.exe.dir/sub.cpp.o
.PHONY : sub.cpp.o

sub.i: sub.cpp.i
.PHONY : sub.i

# target to preprocess a source file
sub.cpp.i:
	$(MAKE) -f CMakeFiles/math.exe.dir/build.make CMakeFiles/math.exe.dir/sub.cpp.i
.PHONY : sub.cpp.i

sub.s: sub.cpp.s
.PHONY : sub.s

# target to generate assembly for a file
sub.cpp.s:
	$(MAKE) -f CMakeFiles/math.exe.dir/build.make CMakeFiles/math.exe.dir/sub.cpp.s
.PHONY : sub.cpp.s

# Help Target
help:
	@echo "The following are some of the valid targets for this Makefile:"
	@echo "... all (the default if no target is provided)"
	@echo "... clean"
	@echo "... depend"
	@echo "... edit_cache"
	@echo "... math.exe"
	@echo "... rebuild_cache"
	@echo "... add.o"
	@echo "... add.i"
	@echo "... add.s"
	@echo "... main.o"
	@echo "... main.i"
	@echo "... main.s"
	@echo "... sub.o"
	@echo "... sub.i"
	@echo "... sub.s"
.PHONY : help



#=============================================================================
# Special targets to cleanup operation of make.

# Special rule to run CMake to check the build system integrity.
# No rule that depends on this can have commands that come from listfiles
# because they might be regenerated.
cmake_check_build_system:
	$(CMAKE_COMMAND) -H$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0
.PHONY : cmake_check_build_system

三、无关文件管理

通过上面的例子可以看出,在执行 cmake 命令的时候,会在当前目录生成一些与项目执行无关的目录和文件,如果再基于 Makefile 执行 make,还会生成更过的中间件文件,这样会导致整个项目变得混乱和难以管理,所以我们需要将通过 cmake 生成的新文件都统一放到一个目录里面进行管理,这个目录通常叫做 build

(base) [root@localhost 10_test]# mkdir build
(base) [root@localhost 10_test]# cd build
(base) [root@localhost build]# cmake ..
-- The C compiler identification is GNU 4.8.5
-- The CXX compiler identification is GNU 4.8.5
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Configuring done
-- Generating done
-- Build files have been written to: /root/gitee/Test/Make_Learn/10_test/build
(base) [root@localhost build]# tree .
.
├── CMakeCache.txt
├── CMakeFiles
│   ├── 2.8.12.2
│   │   ├── CMakeCCompiler.cmake
│   │   ├── CMakeCXXCompiler.cmake
│   │   ├── CMakeDetermineCompilerABI_C.bin
│   │   ├── CMakeDetermineCompilerABI_CXX.bin
│   │   ├── CMakeSystem.cmake
│   │   ├── CompilerIdC
│   │   │   ├── a.out
│   │   │   └── CMakeCCompilerId.c
│   │   └── CompilerIdCXX
│   │       ├── a.out
│   │       └── CMakeCXXCompilerId.cpp
│   ├── cmake.check_cache
│   ├── CMakeDirectoryInformation.cmake
│   ├── CMakeOutput.log
│   ├── CMakeTmp
│   ├── Makefile2
│   ├── Makefile.cmake
│   ├── math.exe.dir
│   │   ├── build.make
│   │   ├── cmake_clean.cmake
│   │   ├── DependInfo.cmake
│   │   ├── depend.make
│   │   ├── flags.make
│   │   ├── link.txt
│   │   └── progress.make
│   ├── progress.marks
│   └── TargetDirectories.txt
├── cmake_install.cmake
└── Makefile    ####################### 在 build 目录下的 Makefile 文件             

6 directories, 26 files
(base) [root@localhost build]# cd ..
(base) [root@localhost 10_test]# ls
add.cpp  add.h  build  CMakeLists.txt  main.cpp  sub.cpp  sub.h
(base) [root@localhost 10_test]# cd build/
(base) [root@localhost build]# make
Scanning dependencies of target math.exe
[ 33%] Building CXX object CMakeFiles/math.exe.dir/add.cpp.o
[ 66%] Building CXX object CMakeFiles/math.exe.dir/sub.cpp.o
[100%] Building CXX object CMakeFiles/math.exe.dir/main.cpp.o
Linking CXX executable math.exe
[100%] Built target math.exe
(base) [root@localhost build]# tree ..
..
├── add.cpp
├── add.h
├── build
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   │   ├── 2.8.12.2
│   │   │   ├── CMakeCCompiler.cmake
│   │   │   ├── CMakeCXXCompiler.cmake
│   │   │   ├── CMakeDetermineCompilerABI_C.bin
│   │   │   ├── CMakeDetermineCompilerABI_CXX.bin
│   │   │   ├── CMakeSystem.cmake
│   │   │   ├── CompilerIdC
│   │   │   │   ├── a.out
│   │   │   │   └── CMakeCCompilerId.c
│   │   │   └── CompilerIdCXX
│   │   │       ├── a.out
│   │   │       └── CMakeCXXCompilerId.cpp
│   │   ├── cmake.check_cache
│   │   ├── CMakeDirectoryInformation.cmake
│   │   ├── CMakeOutput.log
│   │   ├── CMakeTmp
│   │   ├── Makefile2
│   │   ├── Makefile.cmake
│   │   ├── math.exe.dir
│   │   │   ├── add.cpp.o
│   │   │   ├── build.make
│   │   │   ├── cmake_clean.cmake
│   │   │   ├── CXX.includecache
│   │   │   ├── DependInfo.cmake
│   │   │   ├── depend.internal
│   │   │   ├── depend.make
│   │   │   ├── flags.make
│   │   │   ├── link.txt
│   │   │   ├── main.cpp.o
│   │   │   ├── progress.make
│   │   │   └── sub.cpp.o
│   │   ├── progress.marks
│   │   └── TargetDirectories.txt
│   ├── cmake_install.cmake
│   ├── Makefile    ####################### 在 build 目录下的 Makefile 文件  
│   └── math.exe    ####################### 在 build 目录下的 math.exe 文件  
├── CMakeLists.txt
├── main.cpp
├── sub.cpp
└── sub.h

7 directories, 38 files
(base) [root@localhost build]# ./math.exe
10 + 5 = 15
10 - 5 = 5
(base) [root@localhost build]# 

这样就可以在 build 目录中执行 make 命令编译项目,生成的相关文件自然也就被存储到 build 目录中了。这样通过 cmake 和 make 生成的所有文件就全部和项目源文件分离了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python--网络编程之TCP三次握手】

🚀 作者 :“码上有前” 🚀 文章简介 :Python开发技术 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 Python网络编程之[TCP三次握手] 往期内容代码见资源,效果图如下一、实验要求二、协…

MySQL数据库基础(六):DDL数据库操作

文章目录 DDL数据库操作 一、MySQL的组成结构 二、数据库的基本操作 1、创建数据库 2、查询数据库 3、删除数据库 4、选择数据库 三、总结 DDL数据库操作 一、MySQL的组成结构 注:我们平常说的MySQL,其实主要指的是MySQL数据库管理软件。 一个M…

django定时任务(django-crontab)

目录 一:安装django-crontab: 二:添加django_crontab到你的INSTALLED_APPS设置: 三:运行crontab命令来创建或更新cron作业: 四:定义你的cron作业 五:创建你的管理命令&#xff…

电源管理芯片是指在电子设备系统中,负责对电能的变换、分配、检测等进行管理的芯片

萨科微半导体宋仕强介绍说,电源管理芯片是指在电子设备系统中,负责对电能的变换、分配、检测等进行管理的芯片,其性能和可靠性直接影响电子设备的工作效率和使用寿命,是电子设备中的关键器件。萨科微slkor(www.slkormi…

牛客网SQL进阶128:未完成试卷数大于1的有效用户

官网链接: 未完成试卷数大于1的有效用户_牛客题霸_牛客网现有试卷作答记录表exam_record(uid用户ID, exam_id试卷ID, st。题目来自【牛客题霸】https://www.nowcoder.com/practice/46cb7a33f7204f3ba7f6536d2fc04286?tpId240&tqId2183007&ru%2…

【王道数据结构】【chapter5树与二叉树】【P185t4】

编程求以孩子兄弟表示法存储的森林的叶节点数 #include <iostream> typedef struct node{char data;struct node * pchild;struct node * pbrother; }node,*pnode;pnode buynode(char x) {node* tmp(pnode) malloc(sizeof (node));tmp->datax,tmp->pchild nullptr,…

Crypto-RSA1

题目&#xff1a; 已知p,q,dp,dq,c求明文&#xff1a; 首先有如下公式&#xff1a; dp≡d mod (p-1)&#xff0c;dq≡d mod (q-1) &#xff0c; m≡c^d(mod n) &#xff0c; npq python代码解题如下&#xff1a; import libnump 863763376725700856709965348654109117132049…

人工智能学习与实训笔记(三):神经网络之目标检测问题

目录 五、目标检测问题 5.1 目标检测基础概念 5.1.1 边界框&#xff08;bounding box&#xff09; 5.1.2 锚框&#xff08;Anchor box&#xff09; 5.1.3 交并比 5.2 单阶段目标检测模型YOLOv3 5.2.1 YOLOv3模型设计思想 5.2.2 YOLOv3模型训练过程 5.2.3 如何建立输出…

【JS逆向+Python模拟API请求】逆向某一个略微中等的混淆网站,并模拟调用api请求 仅供学习。注:不是源代码混淆,而是一个做代码混淆业务的网站,

逆向日期&#xff1a;2024.02.16 使用工具&#xff1a;Node.js 加密方法&#xff1a;RSA标准库 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 AES解密处理&#xff08;直接解密即可&#xff09;&#xff08;crypto-js.js 标准算法&#xf…

ubuntu22.04@laptop OpenCV Get Started: 012_mouse_and_trackbar

ubuntu22.04laptop OpenCV Get Started: 012_mouse_and_trackbar 1. 源由2. mouse/trackbar应用Demo2.1 C应用Demo2.2 Python应用Demo 3. 鼠标位置跟踪注释3.1 注册回调函数3.2 回调操作3.3 效果 4. 使用轨迹栏调整图像大小4.1 初始化轨迹栏&注册回调函数4.2 回调操作4.3 效…

GEE:如何在下载CSV文件时去除不想要的属性列

作者:CSDN @ _养乐多_ 如下图所示,我们在 Google Earth Engine(GEE)平台上处理完数据,并想以csv文件格式下载属性数据到本地时,GEE会自动添加一些属性,比如用来记录点的坐标的.geo属性。那么我们如何去除.geo列或者其他不想要的列呢?比如,去除下图中index、SR_B3、SR…

如何简单上手清华AutoGPT并搭建到本地环境

一、准备工作 安装Docker&#xff1a;确保你的本地机器上已经安装了Docker。如果还没有安装&#xff0c;请访问Docker官方网站并按照指引进行安装。--点击进入Docker官网 获取清华AutoGPT的Docker镜像&#xff1a;清华AutoGPT团队可能已经提供了一个Docker镜像&#xff0c;方便…

C++入门学习(二十九)goto语句

在C中&#xff0c;goto语句是一种控制流语句&#xff0c;用于无条件地转移到程序中指定的行。goto语句的使用通常是不推荐的&#xff0c;因为它可能导致代码结构变得混乱、不易理解和维护。然而&#xff0c;在某些特殊情况下&#xff0c;goto语句可能是一种有效的解决方法。 示…

2024.2.15 模拟实现 RabbitMQ —— 消息持久化

目录 引言 约定存储方式 消息序列化 重点理解 针对 MessageFileManager 单元测试 小结 引言 问题&#xff1a; 关于 Message&#xff08;消息&#xff09;为啥在硬盘上存储&#xff1f; 回答&#xff1a; 消息操作并不涉及到复杂的增删查改消息数量可能会非常多&#xff…

大数据02-数据仓库

零、文章目录 大数据02-数据仓库 1、数据仓库介绍 &#xff08;1&#xff09;基本概念 数据仓库&#xff0c;英文名称为Data Warehouse&#xff0c;可简写为DW或DWH。数据仓库的目的是构建面向分析的集成化数据环境&#xff0c;为企业提供决策支持&#xff08;Decision Sup…

《Go 简易速速上手小册》第4章:接口与抽象(2024 最新版)

文章目录 4.1 接口的定义与实现 - Go 语言的多面手4.1.1 基础知识讲解4.1.2 重点案例&#xff1a;动物乐队功能描述实现代码 4.1.3 拓展案例 1&#xff1a;通用支付系统拓展案例 1&#xff1a;通用支付系统功能描述实现代码 4.1.4 拓展案例 2&#xff1a;动物园管理器拓展案例 …

MySQL学习Day15——MySQL安装与使用

一、Linux下的MySQL的安装与使用: 卸载MySQL: 1.关闭当前MySQL服务:systemctl stop mysql.service 2.查看当前mysql安装状况:rpm -qa | grep -i mysql 3.卸载上述命令查询出的已安装的程序:yum remove mysql-xxx mysql-xxx mysql-xxxx 4.删除mysql相关文件: (1)查找相关文…

PWM驱动舵机

难点&#xff1a;ARR、PSC /**********************************************************************************************************/ 一、知识补充 舵机原理&#xff1a;总想固定在一个固定角度&#xff08;比较设定和现状&#xff0c;不匹配就转&#xff09; 小车…

贪心算法练习day1

练习1--翻硬币 1&#xff09;题目及要求 2&#xff09;解题思路 输入的是字符串&#xff0c;要想将两组字符串进行一一对比&#xff0c;需要将字符串转换成字符数组&#xff0c;再使用for循环依次遍历字符数组&#xff0c;进行比对。 输入两行字符串&#xff0c;转换成两个字…

牛客——IncDec Sequence(差分)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 给定一个长度为 n(n≤105)(n \leq 10^5 )(n≤105) 的数列a1,a2,…,an{a_1,a_2,…,a_n}a1​,a2​,…,an​&#xff0c;每次可以选择一个区间 [l,r]&#xff0c;使下标在这个区间内的数…