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

目录

一、概述与安装

二、编译源文件

三、无关文件管理


一、概述与安装

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 生成的所有文件就全部和项目源文件分离了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】学习-基础IO—上

Linux基础IO—上 复习c语言接口 你真的懂文件吗? 文件的打开与关闭 深入了解文件读与写(C语言级别) 系统文件I/O 我们知道,文件是放在磁盘(硬件)上的,我们用代码访问文件的思路是: 写代码 -> 编译 -> 生成可执行exe …

fast.ai 机器学习笔记(三)

机器学习 1:第 8 课 原文:medium.com/hiromi_suenaga/machine-learning-1-lesson-8-fa1a87064a53 译者:飞龙 协议:CC BY-NC-SA 4.0 来自机器学习课程的个人笔记。随着我继续复习课程以“真正”理解它,这些笔记将继续更…

【北邮鲁鹏老师计算机视觉课程笔记】03 edge 边缘检测

【北邮鲁鹏老师计算机视觉课程笔记】03 1 边缘检测 有几种边缘? ①实体上的边缘 ②深度上的边缘 ③符号的边缘 ④阴影产生的边缘 不同任务关注的边缘不一样 2 边缘的性质 边缘在信号突变的地方 在数学上如何寻找信号突变的地方?导数 用近似的方法 可以…

linux 08 文件查找

02. 第一. alias 第二. locate: locate 找不到最近的文件 更新locate 后

【深度学习每日小知识】卷积神经网络(CNN)

在深度学习领域,卷积神经网络(CNN)彻底改变了视觉分析领域。凭借从图像中提取复杂模式和特征的能力,CNN 已成为图像分类、目标检测和面部识别等任务不可或缺的一部分。本文全面概述了 CNN,探讨了其架构、训练过程、应用…

Elasticsearch:混合搜索是 GenAI 应用的未来

在这个竞争激烈的人工智能时代,自动化和数据为王。 从庞大的存储库中有效地自动化搜索和检索信息的过程的能力变得至关重要。 随着技术的进步,信息检索方法也在不断进步,从而导致了各种搜索机制的发展。 随着生成式人工智能模型成为吸引力的中…

陪护系统|陪护小程序提升长者护理服务质量的关键

在如今逐渐老龄化的社会中,老年人对更好的护理服务需求不断增加。科技的进步使得陪护小程序系统源码成为提供优质服务的重要途径之一。本文将从运营角度探讨如何优化陪护小程序系统源码,提升长者护理服务的质量。 首先,我们需要对软件的设计和…

MOMENTUM: 1

攻击机 192.168.223.128 目标机 192.168.223.146 主机发现 nmap -sP 192.168.223.0/24 端口扫描 nmap -sV -p- -A 192.168.223.146 开启了22 80端口 看一下web界面 随便打开看看 发现这里有个参数id,sql尝试无果,发现写入什么,网页显示…

MySQL篇----第十七篇

系列文章目录 文章目录 系列文章目录前言一、对于关系型数据库而言,索引是相当重要的概念,请回答有关索引的几个问题二、解释 MySQL 外连接、内连接与自连接的区别三、Myql 中的事务回滚机制概述前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分…

【java】笔记10:类与对象——本章练习

题目1: 代码如下: import java.util.Scanner; public class Input{public static void main(String[]args){Circle cnew Circle();PassObject yuannew PassObject();System.out.println("r""\t""times");yuan.printAreas…

AI大模型学习笔记之四:生成式人工智能(AIGC)是如何工作的?

OpenAI 发布 ChatGPT 已经1年多了,生成式人工智能(AIGC)也已经广为人知,我们常常津津乐道于 ChatGPT 和 Claude 这样的人工智能系统能够神奇地生成文本与我们对话,并且能够记忆上下文情境。 Midjunery和DALLE 这样的AI…

私有化部署一个自己的网盘

效果 安装 1.创建目录 cd /opt mkdir -p kod/{db,site} cd /opt/kod 2.环境文件 vim db.env 内容如下 MYSQL_PASSWORD123456 MYSQL_DATABASEkodbox MYSQL_USERkodbox 3.编写docker-compose.yml vim docker-compose.yml 内容如下 version: 3.5services:db:image: mar…

探索数据可视化:Matplotlib在Python中的高效应用

探索数据可视化:Matplotlib在Python中的高效应用 引言Matplotlib基础安装和配置Matplotlib基础概念绘制简单图表线形图散点图柱状图 图表定制和美化修改颜色、线型和标记添加标题、图例和标签使用样式表和自定义样式 高级图表类型绘制高级图表多图布局和复杂布局交互…

聚观早报 | iOS 17.4正式版将上线;魅族21 Pro或下月发布

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 2月5日消息 iOS 17.4正式版将上线 魅族21 Pro或下月发布 小米MIX Flip细节曝光 OPPO Find X7 Ultra卫星通信版 …

【java】12:封装

面向对象编程三大特征 1.基本介绍 面向对象编程有三大特征:封装、继承和多态。 2.封装介绍 封装(encapsulation)就是把抽象出的数据[属性]和对数据的操作[方法]封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作[方法]&am…

Java中处理I/O操作的不同方式:BIO,NIO,AIO

Java中处理I/O操作的不同方式:BIO,NIO,AIO 亲爱的朋友, 在这美好的时刻,愿你感受到生活的温暖和欢乐。愿你的每一天都充满着笑容和满足,无论面对什么挑战都能勇往直前,化解困境。 希望你的心中充…

ubuntu22.04 安装部署04:经常死机,鼠标,键盘无响应

相关文章: ubuntu22.04 安装部署01:禁用内核更新 ubuntu22.04安装部署02:禁用显卡更新 ubuntu22.04安装部署03: 设置root密码 一、现象说明 1. 开机一小时后,突然之间网络掉线,鼠标、键盘无反应。 2.…

Makefile编译原理 make 中的路径搜索_2

一.make中的路径搜索 VPATH变量和vpath关键字同时指定搜索路径。 实验1 VPATH 和 vpath 同时指定搜索路径 mhrubuntu:~/work/makefile1/18$ tree . ├── inc │ └── func.h ├── main.c ├── makefile ├── src1 │ └── func.c └── src2 └── func.c mak…

面向对象编程:理解其核心概念与应用

引言 在编程的世界中,面向对象编程(Object-Oriented Programming, OOP)已成为一种主流的编程范式。它提供了一种组织和管理代码的有效方式,使得代码更加模块化、可重用和易于维护。本文将带您深入探讨面向对象编程的核心概念及其…

mysql、mybatis中SORT

SORT排序 根据数据表sys_series中HOT(int类型)进行升序排列: 原来的数据库中存储: 排序# 结果是HOT字段为null的所有数据都排在最前面,不为null的数据按升序排列 SELECT * FROM sys_series ORDER BY HOT;# 结果是HOT字段为null的所有数据都排在最后面,不为null的数据按数…