当前位置: 首页 > news >正文

cmake、CMakeLists.txt、make、ninja

文章目录

  • 一、概念
    • 0.cmake官网
    • 1.什么是cmake
    • 2.为什么使用cmake
    • 3.CMakeLists.txt
  • 二、CMakeLists.txt语法:如何编写CMakeLists.txt,语法详解
      • (0)语法基本原则
      • (1)project关键字
      • (2)set关键字
      • (3)message关键字
      • (4)add_executable关键字
      • (5)add_subdirectory关键字
  • 三、使用方法
    • 1.build步骤
      • (1)构建`CMakeLists.txt`
      • (2)在包含`CMakeLists.txt`的目录下使用cmake
      • (3)在包含`Makefile`的目录下使用`make`
      • (4)生成可执行文件。 输入`./可执行程序名`运行
    • 2.示例一
      • (1)项目结构
      • (2)代码
      • (3)构建工具
        • ①make
        • ninja
        • make 与 ninja的比较
        • ④cmake选项:-S -B
    • 3.示例二
      • (1)基础
        • ①先编写main.cpp
        • ②编写CMakeLists.txt
        • ③cmake
        • ④make
        • ⑤执行
      • (2)让Hello,World看起来更像一个工程
        • ①在工程目录下,先编写main.cpp。创建src子目录,将main.cpp放入其中
        • ②在工程目录下编写CMakeLists.txt,包含子目录版本
        • ③在源文件目录src下编写子目录的CMakeLists.txt
        • ④在工程目录下构建子目录build,并在build中进行cmake。出现Makefile后再进行make
      • (3)安装:INSTALL
        • ①安装文件
        • ②安装脚本
        • ③安装目录
        • ④可执行文件安装
        • ⑤执行
      • (4)生成静态库和动态库
        • ①构建动态库(命令用SHARED) (构建静态库,命令用STATIC)
        • ②同时构建静态库和动态库
        • ③使用外部头文件和共享库
  • 四、原理
    • 1.build的意义
    • 2.源内构建、源外构建
    • 3.`CMakeLists.txt` 与 `.cmake文件`的关系
      • (1)CMakeLists.txt
      • (2).cmake文件
      • (3)它们之间的关系
      • (4)如何使用
      • (5)总结
    • 4.`.cmake`与`.cmake.in`文件的关系

一、概念

0.cmake官网

①官方文档网址:www.cmake.org
②cmake官网手册:https://cmake.org/cmake/help/latest/index.html


官网手册
1.cmake的定义:高级编译配置工具
当多个人用不同的语言或者编译器开发一个项目,最终要输出一个可执行文件或者共享库(dll、so),这时候就出现了神器CMake! 所有的操作都是通过编译CMakeLists.txt来完成的。
学习CMake的目的,是为将来处理大型的C/C++/JAVA项目做准备。

2.安装

sudo apt-get install cmake

1.什么是cmake

CMake 是一个跨平台的自动化构建系统,使用简单的配置文件(CMakeLists.txt)来生成标准的构建文件(如Makefile、Visual Studio解决方案等)

CMake(Cross Platform Make)是一个开源的构建系统,它通过配置文件生成特定于平台的构建文件,使得项目可以在不同操作系统和编译器下轻松构建。CMake广泛用于C++项目,但也支持其他语言。

在这里插入图片描述


2.为什么使用cmake

为什么使用CMake?
跨平台支持:一次编写,多处运行,支持Windows、Linux、macOS等。
灵活性:支持复杂的项目结构,处理依赖关系和外部库。
集成工具:与常见的IDE(如Visual Studio、CLion)无缝集成。
社区支持:广泛的文档和社区资源。


3.CMakeLists.txt

每个使用CMake的项目都需要一个或多个CMakeLists.txt文件,用于定义项目的构建过程。通常,根目录有一个主要的CMakeLists.txt,子目录也可以有自己的配置文件

cmake_minimum_required(VERSION x.x): 指定CMake的最低版本要求。
project(ProjectName): 定义项目名称和语言。
add_executable(target_name source_files): 添加可执行目标。
add_library(target_name source_files): 添加库目标。
target_include_directories(target_name PUBLIC/PRIVATE include_dirs): 指定包含目录。
find_package(package REQUIRED): 查找并引入外部包。



二、CMakeLists.txt语法:如何编写CMakeLists.txt,语法详解

(0)语法基本原则

1.变量取值 ${ }
2.分隔多个文件:空格或者分号
3.大小写:指令大小写不敏感,参数和变量对大小写敏感


(1)project关键字

可以用来指定工程的名字和支持的语言,默认支持所有语言
PROJECT(HELLO) 指定了工程的名字为HELLO,且支持所有语言(建议这样做)
PROJECT(HELLO CXX)指定了工程的名字为HELLO,仅支持C++语言
PROJECT(HELLO C CXX)指定了工程的名字为HELLO,仅支持C和C++语言

该指定隐式地定义了两个CMake变了
<projectname>_BINARY_DIR
<projectname>_SOURCE_DIR
本例中是HELLO_BINARY_DIR、HELLO_SOURCE_DIR
MESSAGE关键字就可以直接使用这两个变量。当前都指向当前的工作目录


(2)set关键字

SET用来显式的指定变量,可以为多个
SET(SRC_LIST main.cpp) 意为SRC_LIST变量包含了main.cpp
SET(SRC_LIST main.cpp test1.cpp test2.cpp) 意为SRC_LIST变量包含了main.cpp、test1.cpp、test2.cpp


(3)message关键字

向终端输出用户自定义的信息,主要包含三种:

  • SEND_ERROR:产生错误,生成过程被跳过
  • STATUS:输出前缀为- -的信息
  • FATAL_ERROR:立即终止所有cmake过程

(4)add_executable关键字

生成可执行文件
ADD_EXECUTABLE(hello $(SRC_LIST)),生成的可执行文件名为hello,源文件读取变量SRC_LIST中的内容
也可直接写为 ADD_EXECUTABLE(hello main.cpp)

注意:工程名的HELLO和生成的可执行文件hello是没有任何关系的

所以,上例中的5行CMakeLists.txt可以简化为2行:

PROJECT(HELLO)
ADD_EXECUTABLE(hello main.cpp)

(5)add_subdirectory关键字

①有子目录时,要用ADD_SUBDIRECTORY关键字包含所有需要访问的子文件夹。除了工程目录外,每个被访问的子目录里也都需要有一个CMakeLists.txt说明
将目标文件放入构建目录的bin子目录ADD_SUBDIRECTOR(子目录名 bin):自动在子目录下新建一个名为bin的子目录,存放中间二进制文件、目标二进制文件、库文件。

注意:文件就是file。目录(文件夹)就是directory。



三、使用方法

1.build步骤

(1)构建CMakeLists.txt

CMake 构建脚本是一个纯文本文件,您必须将其命名为 CMakeLists.txt,并在其中包含 CMake 构建您的 C/C++ 库时需要使用的命令。如果您的原生源代码文件还没有 CMake 构建脚本,您需要自行创建一个,并在其中包含适当的 CMake 命令。


(2)在包含CMakeLists.txt的目录下使用cmake

cmake 放置CMakeList.txt路径

(1)“源内构建”(in-source build):
构建放在当前目录下(内部构建):cmake . 即在当前目录cmake,在当前目录build。【不推荐!】
(2)“源外构建”(out-of-source build):
在当前目录下创建build文件夹存放构建文件(外部构建),build内输入cmake ..。即在上级目录cmake,在该目录下build。
结果:生成4个东西:CMakeFiles文件夹、cmake_install.cmake、CMakeCache.txt、Makefile
只要产生Makefile文件,就说明cmake成功了
(3)指定路径
-S -B选项,指定cmake源代码路径和build路径。不写-B,默认为 -B .,即build到当前工作目录

cmake -S /path/to/source -B /path/to/build

(3)在包含Makefile的目录下使用make

直接在build出4个东西的目录下(命令针对的是Makefile)输入make

make

(4)生成可执行文件。 输入./可执行程序名运行


2.示例一

(1)项目结构

假设有一个简单的C++项目,结构如下:

.
├── CMakeLists.txt
├── include
│   └── hello.h
└── src├── hello.cpp└── main.cpp2 directories, 4 files

(2)代码

①src/main.cpp

#include "hello.h"int main() {hello();return 0;
}

②src/hello.cpp

#include <iostream>
#include "hello.h"
using std::cout;
using std::endl;void hello() {cout << "Hello, CMake!" << endl;
}

③include/hello.h

#ifndef HELLO_H
#define HELLO_Hvoid hello();#endif // HELLO_H

④根目录的 CMakeLists.txt

cmake_minimum_required(VERSION 3.10)    #指定CMake的最低版本要求
project(MyProject LANGUAGES CXX)        #定义项目的名称(MyProject)、使用的编程语言(Cpp)set(CMAKE_CXX_STANDARD 17)			    #指定C++标准
set(CMAKE_CXX_STANDARD_REQUIRED True)include_directories(${PROJECT_SOURCE_DIR}/include)     #包含头文件目录
add_executable(MyProject src/main.cpp src/hello.cpp)   #添加可执行文件#add_library(target_name source_files)                                #添加库目标
#target_include_directories(target_name PUBLIC/PRIVATE include_dirs)  #指定包含目录
#find_package(package REQUIRED)                                       #查找并引入外部包

(3)构建工具

make适合小型项目,ninja适合大型项目。(大型C++项目用make单线程会非常慢。4h→5分钟)

构建工具(Build Tool)是用来管理和自动化整个项目构建过程的工具,涉及:预处理、编译、链接、测试、打包、部署等多个步骤。
构建工具的主要任务是根据项目的依赖关系图来确定需要执行的任务,并按照正确的顺序执行这些任务。


①make
mkdir build
cd build
cmake ..
make -j 56
sudo make install

在源外构建的build目录中,cmake .. 等价于cmake -S .. -B .

# 创建并进入构建目录
mkdir -p build && cd build# 配置 CMake(如果你使用 CMake)
cmake .. #等价于cmake -S .. -B .# 使用所有可用的核心进行并行编译
make -j$(nproc)

cmake .. 后生成4个文件:(只要产生Makefile文件,就说明cmake成功了)

Makefile CMakeCache.txt  CMakeFiles  cmake_install.cmake  

make后:
编译文件Makefile,会在build目录下生成可执行文件MyProject


ninja
mkdir build && cd build
cmake .. -G Ninja 
ninja -j 56
ninja install
ninja package_blt

cmake -G Ninja ..后,生成四个文件:

build.ninja  CMakeCache.txt  CMakeFiles  cmake_install.cmake

ninja后:
编译文件build.ninja,会在build目录下生成可执行文件MyProject
在这里插入图片描述


make 与 ninja的比较

1.构建命令不同
cmake ..:使用Make进行构建
cmake .. -G Ninja:使用Ninja进行构建

2.Ninja的构建速度比Make更快
①Ninja相比于传统的Make工具,通常能提供更快的构建速度,特别是在增量构建时,因为它采用了更智能的并行构建方式。
②ninja由于更合理的设计 (最小化构建工具本身的开销、并行构建优化、增量编译),本身编译速度就比make快2-10倍,多线程比单线程又快了10-56倍
③-j 56:最多可以同时运行的作业(jobs)数量为 56。ninja -j 56 意味着 Ninja 将尝试最多并行执行 56 个构建任务,但这并不直接对应于 56 个线程

3.make适合小项目,ninja适合大项目编译


④cmake选项:-S -B

-S /path/to/source:指定 /path/to/source 为源代码目录。
-B /path/to/build:指定 /path/to/build 为构建输出目录。

cmake -S /path/to/source -B /path/to/build

cmake .. 等价于cmake -S .. -B .


3.示例二

(1)基础

①先编写main.cpp
#include <iostream>
using namespace std;
int main(){cout<<"hello,world"<<endl;return 0;
}
②编写CMakeLists.txt
PROJECT(HELLO)            #工程名为HEELOSET(SRC_LIST main.cpp)    #变量SRC_LIST包含main.cppMESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})MESSAGE(STATUS "This is SOURCE dir " ${HELLO_SOURCE_DIR})ADD_EXECUTABLE(hello ${SRC_LIST}) #生成可执行程序文件名为hello,源文件读取变量SRC_LIST中内容
③cmake
cmake .

生成了4个东西:CMakeFiles文件夹、cmake_install.cmake、CMakeCache.txt、Makefile

④make
make

生成了可执行文件hello

⑤执行
./hello

显示"hello,world"


(2)让Hello,World看起来更像一个工程

  • 为工程添加一个子目录src,用来放置工程源代码
  • 为工程添加一个子目录doc,用来放置工程的文档hello.txt
  • 为工程添加文本文件使用文档README版权COPYRIGHT
  • 在工程目录中添加一个runhello.sh脚本,用来调用hello二进制
  • 为工程添加一个子目录bin,用来放置生成的目标文件
①在工程目录下,先编写main.cpp。创建src子目录,将main.cpp放入其中
#include <iostream>
using namespace std;
int main(){cout<<"hello,world"<<endl;return 0;
}
②在工程目录下编写CMakeLists.txt,包含子目录版本
PROJECT(HELLO )            #工程名为HEELO
ADD_SUBDIRECTORY(src bin)  #源文件包含子目录src,目标文件放在构建文件的bin目录下
③在源文件目录src下编写子目录的CMakeLists.txt
ADD_EXECUTABLE(hello main.cpp)
④在工程目录下构建子目录build,并在build中进行cmake。出现Makefile后再进行make
mkdir build        
cd build
cmake ..  #出现5个东西:bin  CMakeCache.txt  CMakeFiles  cmake_install.cmake  Makefile
make      #bin目录中出现了可执行文件hello

只进行到mkdir build时,对工程目录进行tree。效果(目录结构)应该是这样的:
.
├── build
├── CMakeLists.txt
└── src
 ├── CMakeLists.txt
 └── main.cpp


(3)安装:INSTALL

①安装文件

INSTALL(FILES 文件名 DESTINATION 目标地址)
举例3:
工程目录下的CMakeLists.txt添加一行:

INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake)   #会自动安装到/usr/local/share/doc/cmake下

DESTINATION后面:
1.写绝对路径
2.相对路径:
CMAKE_INSTALL_PREFIX 默认是在/usr/local/
若想要更改,可以手动设置

set(CMAKE_INSTALL_PREFIX "目标路径")

这时候再 DESTINATION ${CMAKE_INSTALL_PREFIX},就导出到目标路径上了。


②安装脚本

PROGRAMS:非目标文件的可执行程序安装(比如脚本之类)

INSTALL(PROGRAMS runhello.sh DESTINATION bin)    #实际安装到/usr/bin

③安装目录

安装doc中的hello.txt
方法一:通过在doc目录中建立CMakeLists.txt,通过install下的file
方法二:直接在工程目录中写入

INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake)

④可执行文件安装

在src的CMakeLists.txt里输入

INSTALL(TARGETS hello DESTINATION bin) 

⑤执行
cd build
cmake ..
make
make install



(4)生成静态库和动态库

SET(变量 源文件名)
ADD_LIBRARY(库名 STATIC或SHARED ${变量})

①构建动态库(命令用SHARED) (构建静态库,命令用STATIC)

举例4:

SET(LIBHELLO_SRC hello.cpp)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})    #生成动态库libhello.so

1)构建目录树
.
├── build
├── CMakeLists.txt
└── src
├── CMakeLists.txt
├── hello.cpp
└── hello.h

2 directories, 4 files

2)编写CMakeLists.txt
①工程目录CMakeLists.txt内容为:

cmake_minimum_required(VERSION 3.13)
PROJECT(HELLO)
ADD_SUBDIRECTORY(src bin)

②lib目录CMakeLists.txt内容为:

SET(LIBHELLO_SRC hello.cpp)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC})

3)lib下源文件内容
①hello.h内容

#ifndef HELLO_H
#define HELLO_Hvoid HelloFunc();#endif

②hello.cpp内容

#include "hello.h"
#include <iostream>using namespace std;void HelloFunc(){cout<<"Hello,world!"<<endl;
}

4)在build目录下进行cmake … 、make 。在build/bin下即出现了libhello.so

②同时构建静态库和动态库
SET_TARGET_PROPERTIES

3行命令。视频里补充

③使用外部头文件和共享库

1.添加头文件搜索路径:

INCLUDE_DIRECTORIES(路径)

2.添加需要链接的共享库

TARGET_LINK_LIBRARIES(源文件名 库名)
TARGET_LINK_LIBRARIES(main libhello.so)    #链接动态库
TARGET_LINK_LIBRARIES(main libhello.a)     #链接静态库



四、原理

1.build的意义

在C++代码中,build (构建)的过程是将源代码转化为可执行程序或库的过程。这一过程的意义包括:

1.编译和链接:C++代码通常由多个源文件组成。每个源文件包含程序的不同部分。构建过程通常包括两个主要步骤:

  • 编译 (Compile):将源代码文件(.cpp文件)转化为目标文件(.o或.obj文件)。在编译时,编译器会检查语法错误并生成机器代码,这些代码是特定于计算机架构的。
  • 链接 (Link):将编译后的目标文件以及任何依赖的库文件(如标准库或第三方库)合并成一个单一的可执行文件或库文件。链接器会处理不同模块间的符号引用,确保程序的各个部分能够正确地相互调用。

2.优化:构建过程通常还会进行优化,使得生成的程序在运行时更高效。例如,编译器可能会优化循环,减少冗余代码,或者选择更高效的数据结构。这些优化有助于提高程序的执行速度和减少内存使用。

3.调试信息和错误检查:在构建过程中,如果代码有语法错误、类型不匹配或者其他编译时错误,编译器会报告错误信息。通过构建过程,开发人员可以发现并修复代码中的问题。

4.生成可执行文件:最终的目标是生成一个可执行文件(如.exe文件)或库文件(如.dll或.so文件)。这些文件可以直接在操作系统上运行或被其他程序引用。


在C++代码中,build(构建)的过程是将源代码转化为可执行程序或库的过程。包括:
①编译、链接:将代码从高级语言转为汇编语言、二进制机器码
②转换为汇编语言时,编译器会适当的进行优化,以减少冗余代码,提高效率。
总的来说,build就是为了将源代码转为二进制可执行程序


编译再探:预编译、编译、汇编、链接:https://blog.csdn.net/Edward1027/article/details/125103585

在这里插入图片描述


2.源内构建、源外构建

内部构建:例1就是内部构建,产生的临时文件和源文件堆在一起,不方便清理。BINARY DIR和SOURCE DIR在同一个目录下。
外部构建:把生成的临时文件放在build目录下,方便清理(直接删除build整个文件夹)。BINARY DIR在build目录下,SOURCE DIR在CMakeLists.txt目录下(一般CMakeLists.txt是在build的上级目录,这样可以直接cmake …,然后make)。将build放在CMakeLists.txt同级目录下。推荐使用外部构建。
在这里插入图片描述


3.CMakeLists.txt.cmake文件的关系

(1)CMakeLists.txt

1.作用:
CMakeLists.txt 是 CMake 项目的核心配置文件。它包含了 CMake 的构建指令,定义了如何编译和链接项目的源代码文件。每个 CMake 项目通常会有一个或多个 CMakeLists.txt 文件,通常位于项目的根目录和子目录中。

2.内容:
在 CMakeLists.txt 中,你可以指定:
①项目的名称和版本(project())
②编译选项(add_compile_options())
③要包含的目录(include_directories())
④要编译的源文件(add_executable() 或 add_library())
⑤库的链接(target_link_libraries())
⑥添加子目录(add_subdirectory())
⑦自定义的构建步骤等。

3.示例:

cmake_minimum_required(VERSION 3.10)
project(MyProject)add_executable(MyExecutable main.cpp)
target_link_libraries(MyExecutable SomeLibrary)

(2).cmake文件

1.作用:
.cmake 文件通常是CMake的模块文件,用于存放可重用的配置逻辑、函数、宏等。它们可以被多个 CMakeLists.txt 文件共享,用于封装常用的配置逻辑。你可以将一组常见的 CMake 命令、库查找、构建选项等封装在 .cmake 文件中,然后在 CMakeLists.txt 中通过 include() 命令引入使用。

2.内容:
.cmake 文件通常包含定义 CMake 函数、宏、查找库等内容。它们不直接执行项目的构建,但为 CMakeLists.txt 文件提供了支持。

3.示例:FindSomeLibrary.cmake 文件:

# FindSomeLibrary.cmake
find_package(SomeLibrary REQUIRED)

(3)它们之间的关系

CMakeLists.txt 是项目的主配置文件,用于定义构建流程和其他重要的构建配置。
.cmake 文件通常是模块化配置文件,封装了一些可复用的逻辑,可以通过 include() 命令引入到 CMakeLists.txt 中。
在 CMakeLists.txt 中,你可以通过 include() 或 find_package() 来引用 .cmake 文件,实现项目构建的扩展和模块化。


(4)如何使用

在 CMakeLists.txt 中引用 .cmake 文件的方式:

include(path/to/some_file.cmake)

你也可以通过 find_package() 来加载 .cmake 文件,它会查找并执行某些标准的 CMake 模块(例如查找第三方库等):

find_package(SomeLibrary REQUIRED)

(5)总结

CMakeLists.txt 是 CMake 项目的配置文件,定义了项目的构建方式。
.cmake 文件 是模块化的 CMake 配置文件,用于封装可重用的构建逻辑,可以在多个 CMakeLists.txt 中引用。
它们通过 include() 或 find_package() 连接起来,CMakeLists.txt 通常会引入 .cmake 文件来简化构建配置。


4..cmake.cmake.in文件的关系

.cmake是CMake脚本文件,而.cmake.in是模板文件。

①.cmake 文件是 CMake 的脚本文件,通常用于执行具体的构建、配置或打包任务。在 CMake 构建过程中,这些文件被 CMake 解释和执行,控制整个构建过程或其他相关任务。
②.cmake.in 文件是一个 CMake 模板文件,通常用于在构建过程中生成一个 .cmake 文件,或者生成其他类型的配置文件。它本身并不是一个 CMake 脚本,而是一个包含占位符的模板文件。CMake 会根据指定的值替换模板中的占位符,从而生成一个有效的 .cmake 文件或其他配置文件。

相关文章:

cmake、CMakeLists.txt、make、ninja

文章目录 一、概念0.cmake官网1.什么是cmake2.为什么使用cmake3.CMakeLists.txt 二、CMakeLists.txt语法&#xff1a;如何编写CMakeLists.txt&#xff0c;语法详解(0)语法基本原则(1)project关键字(2)set关键字(3)message关键字(4)add_executable关键字(5)add_subdirectory关键…...

PHP之Cookie和Session

在你有别的编程语言的基础下&#xff0c;你想学习PHP&#xff0c;可能要了解的一些关于cookie和session的信息。 Cookie 参数信息 setcookie(name,value,expire, path, domain); name : Cookie的名称。 value : Cookie的值。 expire : Cookie的过期时间&#xff0c;可以是一…...

学习记录-用例设计编写

黑马测试视频记录 目录 一、 软件测试流程 二、测试用例编写格式 1、等价类法 2、边界值分析法 3、 判定表法 4、场景法​编辑 5、错误推荐法 一、 软件测试流程 二、测试用例编写格式 1、等价类法 2、边界值分析法 3、 判定表法 4、场景法 5、错误推荐法 时间紧任务重…...

【Docker】容器安全之非root用户运行

【Docker】容器安全之非root用户运行 1. 场景2. 原 Dockerfile 内容3. 整改结果4. 非 root 用户带来的潜在问题4.1 文件夹读写权限异常4.2 验证文件夹权限 1. 场景 最近有个项目要交付&#xff0c;第三方测试对项目源码扫描后发现一个问题&#xff0c;服务的 Dockerfile 都未指…...

CVE-2025-0392:JeeWMS graphReportController.do接口SQL注入漏洞复现

文章目录 CVE-2025-0392:JeeWMS graphReportController.do接口SQL注入漏洞复现0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.构造POC2.复现CVE-2025-0392:JeeWMS graphReportController.do接口SQL注入漏洞复现 0x01 前言 免责声明:请勿利用文章内的相…...

如何使用 Python+Flask+win32print 实现简易网络打印服务1

Python 实现网络打印机&#xff1a;Flask win32print 在工作场景中&#xff0c;我们可能需要一个简单的网页接口&#xff0c;供他人上传文档并自动打印到指定打印机。 本文将演示如何使用 Python Flask win32print 库来实现这一需求。 代码详见&#xff1a;https://github.…...

Ubuntu20.04双系统安装及软件安装(十一):向日葵远程软件

Ubuntu20.04双系统安装及软件安装&#xff08;十一&#xff09;&#xff1a;向日葵远程软件 打开向日葵远程官网&#xff0c;下载图形版本&#xff1a; 在下载目录下打开终端&#xff0c;执行&#xff1a; sudo dpkg -i SunloginClient(按tab键自动补全)出现报错&#xff1a; …...

鸿蒙启动页开发

鸿蒙启动页开发 1.1 更改应用名称和图标 1.更改应用图标 找到moudle.json5文件&#xff0c;找到应用启动的EntryAbility下面的icon,将原来的图标改成自己设置的即可 2.更改应用名称 3.效果展示 2.1 广告页面开发 3.1 详细介绍 3.1.1 启动页面 import { PrivacyDialog } fr…...

认知动力学视角下的生命优化系统:多模态机器学习框架的哲学重构

认知动力学视角下的生命优化系统&#xff1a;多模态机器学习框架的哲学重构 一、信息熵与生命系统的耗散结构 在热力学第二定律框架下&#xff0c;生命系统可视为负熵流的耗散结构&#xff1a; d S d i S d e S dS d_iS d_eS dSdi​Sde​S 其中 d i S d_iS di​S为内部熵…...

【Python编程】高性能Python Web服务部署架构解析

一、FastAPI 与 Uvicorn/Gunicorn 的协同 1. 开发环境&#xff1a;Uvicorn 直接驱动 作用&#xff1a;Uvicorn 作为 ASGI 服务器&#xff0c;原生支持 FastAPI 的异步特性&#xff0c;提供热重载&#xff08;--reload&#xff09;和高效异步请求处理。 启动命令&#xff1a; u…...

仿mudou库one thread oneloop式并发服务器

项目gitee&#xff1a;仿muduo: 仿muduo 一&#xff1a;项目目的 1.1项目简介 通过咱们实现的⾼并发服务器组件&#xff0c;可以简洁快速的完成⼀个⾼性能的服务器搭建。 并且&#xff0c;通过组件内提供的不同应⽤层协议⽀持&#xff0c;也可以快速完成⼀个⾼性能应⽤服务器…...

AI推理模型竞赛:从DeepSeek R1到Claude 3.7的关键进展

摘要 在Reasoning Model首轮竞赛中&#xff0c;从R1到Sonnet 3.7&#xff0c;AI领域取得了显著进展。DeepSeek R1的发布激发了推理模型的竞争。过去一个月内&#xff0c;顶尖AI实验室相继推出了三款最新的SOTA推理模型&#xff1a;OpenAI的o3-mini和deep research&#xff0c;x…...

AORO P9000 PRO三防平板携手RTK高精度定位,电力巡检效率倍增

电网系统覆盖幅员辽阔&#xff0c;每年因设备故障导致的巡检耗时超过百万工日。传统巡检模式受限于定位误差、设备防护不足和作业效率低下三大核心痛点&#xff0c;亟需智能化工具的突破性革新。为了满足这一需求&#xff0c;遨游通讯推出AORO P9000 PRO三防平板&#xff0c;以…...

【Linux———信号精讲】

你是怎么做到的&#xff0c;给了她想要的爱............................................................................................ 文章目录 前言 一、【信号入门】 1.1、【生活角度的信号】 1.2、【ctrl c与z】 1.3、【信号的发送与记录】 1.4、【信号处理常见方式…...

Unity 文字高度自适应

期望 文字有字号限制&#xff0c;输入文字文字后先判断高度是否适用于限制字号&#xff0c;若处于最小字号时高度任不适用&#xff0c;则调整RectTransform 的高度。 核心代码 每次输入文字时先将字号设定为原始字号。 comp.fontSize fontSize; comp.text content; 拓展T…...

鸿蒙通过用户首选项实现数据持久化

鸿蒙通过用户首选项实现数据持久化 1.1 场景介绍 用户首选项为应用提供Key-Value键值型的数据处理能力&#xff0c;支持应用持久化轻量级数据&#xff0c;并对其修改和查询。当用户希望有一个全局唯一存储的地方&#xff0c;可以采用用户首选项来进行存储。Preferences会将该…...

数字图像相关(DIC)技术用于生物力学和生物材料测试

生物医学工程是一个跨学科科学领域&#xff0c;旨在改善人类健康和医疗护理。从工程的角度来看&#xff0c;生物材料、力生物学和生物制造与目标生物系统的相互作用&#xff0c;以实现各种医学治疗目的。数字图像相关(DIC)技术&#xff0c;作为一种非接触、精准高效、无损的全场…...

java8中young gc的垃圾回收器选型,您了解嘛

在 Java 8 的 Young GC&#xff08;新生代垃圾回收&#xff09;场景中&#xff0c;对于 ToC的场景&#xff0c;即需要尽可能减少垃圾回收停顿时间以满足业务响应要求的场景&#xff0c;以下几种收集器各有特点&#xff0c;通常 Parnew和 G1 young表现较为出色&#xff0c;下面详…...

【五.LangChain技术与应用】【13.LangChain与智普大模型接入:行业领先的AI整合】

当LangChain遇到智普大模型:拆解一个AI整合的超级方案 最近半年,我一直在跟几个创业团队合作搞AI落地项目,发现一个特别有意思的现象:现在企业想用大模型干点实事,最大的痛点反而不是模型本身的能力,而是怎么把模型"塞"进现有系统里,还要塞得优雅、塞得高效。…...

【 <一> 炼丹初探:JavaWeb 的起源与基础】之 Servlet 与 JSP 的协作:MVC 模式的雏形

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、Servl…...

NO1.C++语言基础|四种智能指针|内存分配情况|指针传擦和引用传参|const和static|c和c++的区别

1. 说⼀下你理解的 C 中的四种智能指针 智能指针的作用是管理指针&#xff0c;可以避免内存泄漏的发生。 智能指针就是一个类&#xff0c;当超出了类的作用域时&#xff0c;就会调用析构函数&#xff0c;这时就会自动释放资源。 所以智能指针作用的原理就是在函数结束时自动释…...

【第14节】C++设计模式(行为模式)-Strategy (策略)模式

一、问题的提出 Strategy 模式&#xff1a;算法实现与抽象接口的解耦 Strategy 模式和 Template 模式要解决的问题是相似的&#xff0c;都是为了将业务逻辑&#xff08;算法&#xff09;的具体实现与抽象接口解耦。Strategy 模式通过将算法封装到一个类&#xff08;Context&am…...

《挑战你的控制力!开源小游戏“保持平衡”开发解析:用HTML+JS+CSS实现物理平衡挑战》​

&#x1f4cc; 大家好&#xff0c;我是智界工具库&#xff0c;致力于分享好用实用且智能的软件以及在JAVA语言开发中遇到的问题&#xff0c;如果本篇文章对你有所帮助请帮我点个小赞小收藏吧&#xff0c;谢谢喲&#xff01;&#x1f618;&#x1f618;&#x1f618; 博主声…...

计算机数据库三级刷题总结(博主89分已过,总结的内容分享)

计算机数据库三级刷题总结&#xff08;博主89分已过&#xff0c;总结的内容分享&#xff09; 文章目录 计算机数据库三级刷题总结&#xff08;博主89分已过&#xff0c;总结的内容分享&#xff09;一、 数据库设计阶段二、事务相关三、数据库设计顺序四、数据库三级模式与二层映…...

鸿蒙HarmonyOS-Navagation基本用法

Navagation基本用法 Navigation组件是路由导航的根视图容器&#xff0c;一般作为Page页面的根容器使用&#xff0c;其内部默认包含了标题栏&#xff0c;内容栏和公工具栏&#xff0c;其中内容区默认首页显示导航内容&#xff08;Navigation的子组件&#xff09;或非首页显示&am…...

AD学习-最小系统板,双层

第一章 简单电阻容模型的创建 捕捉栅格在摆放器件时&#xff0c;一般设置成 10mil。移动器件时一般设置成100mil。 比如绘制电容的原理图库&#xff0c;直接就是两根线条竖着成电容&#xff0c; 按Tab键进行颜色变更&#xff0c;按shift键拖动会复制一个出来。 …...

【一.大模型认知与核心原理篇】【3. GPT解密:大模型背后的核心技术】

各位科技爱好者,今天咱们要干一票大的——把GPT这个AI界的当红顶流扒个底朝天。你以为ChatGPT会聊天就是它的全部能耐?Too young!这货肚子里藏的可是价值百亿美金的黑科技。咱们不整那些虚头巴脑的概念,直接上手拆解它的技术内脏,让你看看这个每天被调戏的聊天机器人,到底…...

说一下SpringBoot3新特新和JDK17新特性

JDK1.8&#xff08;Java8&#xff09;新特性 stream流式编程 流处理 Stream API 提供了对集合数据进行操作的一种高效、简洁的方式。它支持顺序和并行的聚合操作 如&#xff1a;过滤&#xff08;filter&#xff09;、排序&#xff08;sort&#xff09;、映射&#xff08;map&…...

二、Visual Studio2022配置OpenGL环境

文章目录 一、OpenGL库的下载二、OpenGL环境配置三、测试代码演示 一、OpenGL库的下载 OpenGL配置的库是GLFWGLAD &#xff0c;GLFW 主要用于创建 OpenGL 窗口和管理输入&#xff1b;GLAD 主要用于加载 OpenGL 函数 GLFW下载地址 下载Windows的32bit版本即可。 下载完成解压如…...

可视化编辑器选择

可视化页面编辑器选择 最近要开发一个低代码项目&#xff0c;一个低代码项目技术难点都在可视化编辑器上面&#xff0c;由于没有充足的时间&#xff0c;也没有可视化页面编辑器开发技术能力&#xff0c;因此找到一个靠谱的可视化编辑器&#xff0c;基本就成功了一半。 需求 …...

tomcat的安装与配置(包含在idea中配置tomcat)

Tomcat 是由 Apache 软件基金会开发的开源 Java Web 应用服务器&#xff0c;主要用于运行 Servlet 和 JSP&#xff08;JavaServer Pages&#xff09;程序。它属于轻量级应用服务器&#xff0c;适用于中小型系统及开发调试场景&#xff0c;尤其在处理动态内容&#xff08;如 Jav…...

【编写UI自动化测试集】Appium+Python+Unittest+HTMLRunner​

简介 获取AppPackage和AppActivity 定位UI控件的工具 脚本结构 PageObject分层管理 HTMLTestRunner生成测试报告 启动appium server服务 以python文件模式执行脚本生成测试报告 下载与安装 下载需要自动化测试的App并安装到手机 获取AppPackage和AppActivity 方法一 有源码的…...

递归入手三维动态规划

一和零 https://leetcode.cn/problems/ones-and-zeroes/description/ 题目解析 由递归入手, 就是一颗选和不选的树, 我们很好通过 dfs 来写出递归 题目解析 public class 一和零 {public static int zeros;public static int ones;public int findMaxForm(String[] strs, …...

Vue中实现大文件的切片并发下载和下载进度展示

Vue中实现大文件的切片下载 切片下载需要后端提供两个接口&#xff0c;第一个接口用来获取当前下载文件的总切片数&#xff0c;第二个接口用来获取具体某一个切片的内容。 界面展示 数据流展示 代码 接口 // 切片下载-获取文件的总切片数 export function getChunkDownload…...

行为模式---命令模式

概念 命令模式是一种行为设计模式&#xff0c;它的核心思想就是将请求封装为一个对象&#xff0c;此对象包含与请求相关的所有信息。可以用不同的请求对客户进行参数化。命令模式通过将请求的发送者和接收者解耦&#xff0c;支持请求的排队、记录、撤销等操作。 使用场景 1、…...

GNU Binutils 全工具指南:从编译到逆向的完整生态

1. GNU Binutils 全工具指南&#xff1a;从编译到逆向的完整生态 1. GNU Binutils 全工具指南&#xff1a;从编译到逆向的完整生态 1.1. 引言1.2. 工具分类速查表1.3. 核心工具详解 1.3.1. 编译与汇编工具 1.3.1.1. as&#xff08;汇编器&#xff09;1.3.1.2. gcc&#xff08;…...

【手撕算法】支持向量机(SVM)从入门到实战:数学推导与核技巧揭秘

摘要 支持向量机&#xff08;SVM&#xff09;是机器学习中的经典算法&#xff01;本文将深入解析最大间隔分类原理&#xff0c;手撕对偶问题推导过程&#xff0c;并实战实现非线性分类与图像识别。文中附《统计学习公式手册》及SVM调参指南&#xff0c;助力你掌握这一核心算法…...

[QT]开发全解析:从概念到实战

文章目录 Qt 框架入门与应用开发指南一、Qt 框架概述1.1 什么是 Qt1.2 Qt 的发展史1.3 Qt 支持的平台1.4 Qt 版本1.5 Qt 的优点1.6 Qt 的应用场景1.7 Qt 的成功案例 二、Qt 的开发工具概述Qt CreatorVisual StudioEclipse 三、认识 Qt Creator3.1 Qt Creator 概览3.2 使用 Qt C…...

进程控制 ─── linux第15课

目录 进程控制 1.进程创建 (fork前面讲过了) 写时拷贝 进程终止 进程退出场景 退出码 进程终止方法 进程控制 1.进程创建 (fork前面讲过了) 在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父…...

uniapp:小程序将base64图片字符串保存到手机相册

一、需求分析 用户提供的是Base64格式的图片数据&#xff0c;而小程序保存图片到本地通常需要的是临时文件路径。 第一步可能需要将Base64数据转换成临时文件&#xff0c;然后再保存到手机相册。 第二步查阅UniApp的文档&#xff0c;关于保存图片到相册的相关API&#xff0c;…...

宇树科技再落一子!天羿科技落地深圳,加速机器人创世纪

2025年3月5日&#xff0c;机器人行业龙头宇树科技&#xff08;Unitree&#xff09;在深圳再添新动作——全资子公司深圳天羿科技有限公司正式成立。这家注册资本10万元、法定代表人周昌慧的新公司&#xff0c;聚焦智能机器人研发与销售&#xff0c;标志着宇树科技在华南市场的战…...

个推助力小米米家全场景智能生活体验再升级

当AI如同水电煤一般融入日常&#xff0c;万物互联的图景正从想象照进现实。作为智能家居领域的领跑者&#xff0c;小米米家凭借开放的生态战略&#xff0c;已连接了超8.6亿台设备&#xff0c;构建起全球领先的消费级AIoT平台。如今&#xff0c;小米米家携手个推&#xff0c;通过…...

四款GIS工具箱软件解析:满足企业多样化空间数据需求

概述 随着地理信息系统&#xff08;GIS&#xff09;在城市规划、环境监测、资源管理等领域的广泛应用&#xff0c;各种GIS工具箱软件不断涌现&#xff0c;为用户提供了强大的数据处理、空间分析和地图制图功能。本文将为大家介绍4款GIS工具箱软件&#xff0c;这些软件各具特色…...

Deepseek×ComfyUI革命性工作流:AI图像3倍速精修实战指南

一、为什么选择深度优化的AI精修方案&#xff08;H2&#xff09; 核心关键词&#xff1a;AI图像优化工作流、ComfyUI加速方案、Deepseek节点配置 ▸ 传统Stable Diffusion耗时痛点分析&#xff08;渲染时间/显存占用&#xff09; ▸ 深度神经网络的并行计算优势对比&#xff…...

IntelliJ IDEA 2024.3.4 版本无法正常加载maven项目

报错如下&#xff1a; Possible solutions: - Check that Maven settings.xml does not contain http repositories - Check that Maven pom files do not contain http repository http://192.168.22.76:9003/repository/thirdparty/ - Check that Maven pom files do not co…...

为什么过滤器需要一个 Wrapper 来 extends HttpServletRequestWrapper

为什么过滤器需要一个 Wrapper 来 extends HttpServletRequestWrapper 1. HttpServletRequest 不可直接修改2. 能够修改请求参数和请求体3. 方便扩展与重用4. 处理请求参数和请求体5. 避免对原始请求做修改 典型使用场景举个例子总结 在 Java Web 开发中&#xff0c;过滤器&…...

SpaCy处理NLP的详细工作原理及工作原理框图

spaCy处理NLP的详细工作原理及工作原理框图 spaCy处理NLP的详细工作原理 spaCy是一个基于Python的开源自然语言处理&#xff08;NLP&#xff09;库&#xff0c;它提供了一系列高效且易用的工具&#xff0c;用于执行各种NLP任务&#xff0c;如文本预处理、文本解析、命名实体识…...

数学软件Matlab下载|支持Win+Mac网盘资源分享

如大家所了解的&#xff0c;Matlab与Maple、Mathematica并称为三大数学软件。Matlab应用广泛&#xff0c;常被用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人&#xff0c;控制系统等领域。 Matlab将数值分析、矩阵计算、科学…...

OCPP与ISO 15118集成:实现即插即充与车网互动(V2G)- 慧知开源充电桩平台

OCPP与ISO 15118集成&#xff1a;实现即插即充与车网互动&#xff08;V2G&#xff09; 引言 随着电动汽车&#xff08;EV&#xff09;与电网双向能量交互&#xff08;V2G&#xff09;技术的成熟&#xff0c;OCPP协议与ISO 15118标准的协同成为智能充电基础设施的核心挑战。本文…...

【C++设计模式】第七篇:桥接模式(Bridge)

注意&#xff1a;复现代码时&#xff0c;确保 VS2022 使用 C17/20 标准以支持现代特性。 抽象与实现的解耦之道 1. 模式定义与用途​​ 核心思想​ ​桥接模式&#xff1a;将抽象部分与实现部分分离&#xff0c;使二者可以独立变化。​关键用途&#xff1a; ​1.拆分复杂继承…...