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.cpp

2 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_H

void 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)            #工程名为HEELO

SET(SRC_LIST main.cpp)    #变量SRC_LIST包含main.cpp

MESSAGE(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_H

void 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 文件或其他配置文件。

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

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

相关文章

DeepSeek本地接口调用(Ollama)

前言 上篇博文&#xff0c;我们通过Ollama搭建了本地的DeepSeek模型&#xff0c;本文主要是方便开发人员&#xff0c;如何通过代码或工具&#xff0c;通过API接口调用本地deepSeek模型 前文&#xff1a;DeepSeek-R1本地搭建_deepseek 本地部署-CSDN博客 注&#xff1a;本文不仅…

前端基础之浏览器本地存储

如我们在一些网站中&#xff0c;去进行数据搜索&#xff0c;在浏览器中是有一个对于的存储的&#xff0c;并且我们可以去手动进行value的增删操作 LocalStroage的使用 并且将浏览器关闭之后&#xff0c;数据也会保存&#xff0c;除非用户手动清理数据或是清空缓存 <!DOCTYPE…

2025 聚合易支付完整版PHP网站源码

源码介绍 2025 聚合易支付完整版PHP网站源码 PHP版本&#xff1a;PHP74 源码上传服务器&#xff0c;解压访问域名即可安装 安装完成后一定要设置伪静态 源码里面nginx.txt 就是伪静态 然后复制粘贴到伪静态里面保存即可 部分截图 源码获取 2025 聚合易支付完整版PHP网站源码…

Spring Boot 3 整合 MinIO 实现分布式文件存储

引言 文件存储已成为一个做任何应用都不可回避的需求。传统的单机文件存储方案在面对大规模数据和高并发访问时往往力不从心&#xff0c;而分布式文件存储系统则提供了更好的解决方案。本篇文章我将基于Spring Boot 3 为大家讲解如何基于MinIO来实现分布式文件存储。 分布式存…

easyExcel使用案例有代码

easyExcel 入门,完成web的excel文件创建和导出 easyExcel官网 EasyExcel 的主要特点如下&#xff1a; 1、高性能&#xff1a;EasyExcel 采用了异步导入导出的方式&#xff0c;并且底层使用 NIO 技术实现&#xff0c;使得其在导入导出大数据量时的性能非常高效。 2、易于使…

NVIDIA(英伟达) GPU 芯片架构发展史

GPU 性能的关键参数 CUDA 核心数量&#xff08;个&#xff09;&#xff1a;决定了 GPU 并行处理能力&#xff0c;在 AI 等并行计算类业务下&#xff0c;CUDA 核心越多性能越好。 显存容量&#xff08;GB&#xff09;&#xff1a;决定了 GPU 加载数据量的大小&#xff0c;在 AI…

FFMPEG利用H264+AAC合成TS文件

本次的DEMO是利用FFMPEG框架把H264文件和AAC文件合并成一个TS文件。这个DEMO很重要&#xff0c;因为在后面的推流项目中用到了这方面的技术。所以&#xff0c;大家最好把这个项目好好了解。 下面这个是流程图 从这个图我们能看出来&#xff0c;在main函数中我们主要做了这几步&…

获取Kernel32基地址

暴力搜索 32位在4G内存搜索有一定可行性&#xff0c;但是处理起来其实还是比较麻烦的&#xff0c;因为内存不可读会触发异常&#xff0c;需要对这些异常问题进行处理。 优化思路:缩小范围、增大搜索步长 (1)不优化&#xff0c;原始内存特征匹配&#xff0c;容易出错&#xf…

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

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

如何在Github上面上传本地文件夹

前言 直接在GitHub网址上面上传文件夹是不行的&#xff0c;需要一层一层创建然后上传&#xff0c;而且文件的大小也有限制&#xff0c;使用Git进行上传更加方便和实用 1.下载和安装Git Git - Downloads 傻瓜式安装即可 2.获取密钥对 打开自己的Github&#xff0c;创建SSH密钥&…

软件高级架构师 - 软件工程

补充中 测试 测试类型 静态测试 动态测试 测试阶段 单元测试中&#xff0c;包含性能测试&#xff0c;如下&#xff1a; 集成测试中&#xff0c;包含以下&#xff1a; 维护 遗留系统处置 高水平低价值&#xff1a;采取集成 对于这类系统&#xff0c;采取 集成 的方式&…

初始提示词(Prompting)

理解LLM架构 在自然语言处理领域&#xff0c;LLM&#xff08;Large Memory Language Model&#xff0c;大型记忆语言模型&#xff09;架构代表了最前沿的技术。它结合了存储和检索外部知识的能力以及大规模语言模型的强大实力。 LLM架构由外部记忆模块、注意力机制和语…

react中如何使用使用react-redux进行数据管理

以上就是react-redux的使用过程&#xff0c;下面我们开始优化部分&#xff1a;当一个组件只有一个render生命周期&#xff0c;那么我们可以改写成一个无状态组件&#xff08;UI组件到无状态组件&#xff0c;性能提升更好&#xff09;

Vue 监听器的魔法之旅:@Watch(‘form.productId’) vs @Watch(‘value’) 大揭秘!✨

以下是一篇技术博客&#xff0c;主题围绕 Watch(form.productId) 和 Watch(value) 这两个 watcher 的功能、区别及使用场景&#xff0c;基于 compare-form.vue 的代码。准备好一起探索 Vue 监听器的魔法了吗&#xff1f;&#x1f604; &#x1f604; Vue 监听器的魔法之旅&…

SqlSugar 语法糖推荐方式

//方式1&#xff1a;var dd _repository._Db.Queryable<ConfigAggregateRoot, UserRoleEntity>((o, p) > o.Id p.Id).Select((o, p) > new{o.Id,o.Remark,p.RoleId,});//方式2&#xff1a;不推荐使用&#xff0c;建议优先使用 Lambda 表达式&#xff0c;因为它更…

数据结构:八大排序(冒泡,堆,插入,选择,希尔,快排,归并,计数)详解

目录 一.冒泡排序 二.堆排序 三.插入排序 四.选择排序 五.希尔排序 六.快速排序 1.Lomuto版本&#xff08;前后指针法&#xff09; 2.Lomuto版本的非递归算法 3.hoare版本&#xff08;左右指针法&#xff09; 4.挖坑法找分界值&#xff1a; 七.归并排序 八.计数排序…

?算法1-4 小A点菜

题目描述 不过 uim 由于买了一些书&#xff0c;口袋里只剩 M 元 (M≤10000)。 餐馆虽低端&#xff0c;但是菜品种类不少&#xff0c;有 N 种 (N≤100)&#xff0c;第 i 种卖 ai​ 元 (ai​≤1000)。由于是很低端的餐馆&#xff0c;所以每种菜只有一份。 小 A 奉行“不把钱吃…

Linux设备驱动开发之摄像头驱动移植(OV5640)

驱动移植 这里用的是NXP提供的原厂linux内核源码&#xff0c;目的是学习ov5640相关摄像头驱动的移植。如图&#xff0c;下面是linux源码自带的ov5640的驱动相关代码&#xff1a; 这个是ov5640相关头文件&#xff1a; 新建一个文件夹保存这些ov5640的驱动文件&#xff0c;打算在…

DeepSeek使用手册分享-附PDF下载连接

本次主要分享DeepSeek从技术原理到使用技巧内容&#xff0c;这里展示一些基本内容&#xff0c;后面附上详细PDF下载链接。 DeepSeek基本介绍 DeepSeek公司和模型的基本简介&#xff0c;以及DeepSeek高性能低成本获得业界的高度认可的原因。 DeepSeek技术路线解析 DeepSeek V3…

ArcGIS Pro应用指南:如何为栅格图精确添加坐标信息

一、引言 在地理信息系统中&#xff0c;栅格图是一种重要的数据类型。 然而&#xff0c;有时我们从网络上获取的栅格图并不包含坐标信息&#xff0c;这使得它们难以与其他带有坐标信息的数据进行集成和分析。 为了解决这一问题&#xff0c;我们需要对栅格图进行地理配准&…