Cmake的详细使用

CSDN复制进来的mk笔记很乱 可以看下面的pdf文档 比较清晰
https://download.csdn.net/download/qq_41537499/89512254

Cmake
apt install cmake
cmake --version
cmake version 3.22.1

vim main.cpp
main.cpp 代码:
#include
int main(int argc,char *argv[])
{
std::cout << “hello, world” << std::endl;
return(0);
}

#一般的单文件执行用g++
g++ main.cpp -o app
//生成了一个可执行的文件app
-rwxr-xr-x 1 root root 16528 7月 2 18:19 app*

执行这个文件

./app 输出:hello, world

换成Cmake执行
touch CMakeLists.txt
vim CMakeLists.txt

CMakeLists.txt 内容:
cmake_minimum_required(VERSION 3.15)
project(test)
add_executable(app main.cpp)

执行Cmake 此时的main.cpp与CMakeLists.txt在同一级目录 用 .
root@zyp:/opt/test_bazel/examples/cpp-tutorial/stage1# cmake .
– Configuring done
– Generating done
– Build files have been written to: /opt/test_bazel/examples/cpp-tutorial/stage1

执行完命令多了CMakeCache.txt、cmake_install.cmake、Makefile文件以及 CMakeFiles文件夹

然后我们创建一个build文件夹,存放Cmake生成的文件
cd build
cmake … #当前在build下 、main.cpp在上级 所以用cmake…

– The C compiler identification is GNU 11.4.0
– The CXX compiler identification is GNU 11.4.0
– Detecting C compiler ABI info
– Detecting C compiler ABI info - done
– Check for working C compiler: /usr/bin/cc - skipped
– Detecting C compile features
– Detecting C compile features - done
– Detecting CXX compiler ABI info
– Detecting CXX compiler ABI info - done
– Check for working CXX compiler: /usr/bin/c++ - skipped
– Detecting CXX compile features
– Detecting CXX compile features - done
– Configuring done
– Generating done
– Build files have been written to: /opt/test_bazel/examples/cpp-tutorial/stage1/build
查看当前build下生成的目录结构
├── CMakeCache.txt
├── CMakeFiles
│ ├── 3.22.1
│ │ ├── CMakeCCompiler.cmake
│ │ ├── CMakeCXXCompiler.cmake
│ │ ├── CMakeDetermineCompilerABI_C.bin
│ │ ├── CMakeDetermineCompilerABI_CXX.bin
│ │ ├── CMakeSystem.cmake
│ │ ├── CompilerIdC
│ │ │ ├── a.out
│ │ │ ├── CMakeCCompilerId.c
│ │ │ └── tmp
│ │ └── CompilerIdCXX
│ │ ├── a.out
│ │ ├── CMakeCXXCompilerId.cpp
│ │ └── tmp
│ ├── app.dir
│ │ ├── build.make
│ │ ├── cmake_clean.cmake
│ │ ├── compiler_depend.make
│ │ ├── compiler_depend.ts
│ │ ├── DependInfo.cmake
│ │ ├── depend.make
│ │ ├── flags.make
│ │ ├── link.txt
│ │ └── progress.make
│ ├── cmake.check_cache
│ ├── CMakeDirectoryInformation.cmake
│ ├── CMakeOutput.log
│ ├── CMakeTmp
│ ├── Makefile2
│ ├── Makefile.cmake
│ ├── progress.marks
│ └── TargetDirectories.txt
├── cmake_install.cmake
└── Makefile

利用MakeFile文件生成可执行文件app
root@zyp:/opt/test_bazel/examples/cpp-tutorial/stage1/build# make
[ 50%] Building CXX object CMakeFiles/app.dir/main.cpp.o
[100%] Linking CXX executable app
[100%] Built target app
root@zyp:/opt/test_bazel/examples/cpp-tutorial/stage1/build# ./app
hello, world
set使用
CMakeLists.tst

cmake_minimum_required(VERSION 3.15)
project(test)
set(SRC main.cpp) #SRC是定义的一个变量
set(EXECUTABLE_OUTPUT_PATH /opt/test_Cmake/build) #设置一个生成的可执行程序的输出目录,没有这个文件夹会自动生成
set(CMAKE_CXX_STANDARD 11) #设置c++标准 是11
add_executable(app ${SRC})

root@zyp:/opt/test_bazel/examples/cpp-tutorial/stage1/build# cmake …
– Configuring done
– Generating done
– Build files have been written to: /opt/test_bazel/examples/cpp-tutorial/stage1/build
root@zyp:/opt/test_bazel/examples/cpp-tutorial/stage1/build# ll
总计 40
drwxr-xr-x 3 root root 4096 7月 3 11:20 ./
drwxr-xr-x 4 root root 4096 7月 3 11:20 …/
-rw-r–r-- 1 root root 13847 7月 3 11:19 CMakeCache.txt
drwxr-xr-x 5 root root 4096 7月 3 11:20 CMakeFiles/
-rw-r–r-- 1 root root 1664 7月 3 11:20 cmake_install.cmake
-rw-r–r-- 1 root root 5158 7月 3 11:20 Makefile
查看我们定义的输出目录 没有执行make之前是没有文件的
root@zyp:/opt/test_Cmake/build# ll
drwxr-xr-x 2 root root 4096 7月 3 11:20 ./
drwxr-xr-x 3 root root 4096 7月 3 11:20 …/
执行make
root@zyp:/opt/test_bazel/examples/cpp-tutorial/stage1/build# make
[ 50%] Building CXX object CMakeFiles/app.dir/main.cpp.o
[100%] Linking CXX executable /opt/test_Cmake/build/app
[100%] Built target app

发现在我们自定义文件夹下/opt/test_Cmake/build下生成了可执行程序app
root@zyp:/opt/test_Cmake/build# ls
app
root@zyp:/opt/test_Cmake/build# ./app
hello, world
CMakeLists.txt中主要的几个宏
aux_source_directory、CMAKE_CURRENT_SOURCE_DIR、PROJECT_SOURCE_DIR、file
CMAKE_CURRENT_SOURCE_DIR和PROJECT_SOURCE_DIR区别
CMAKE_CURRENT_SOURCE_DIR:当前正在处理的CMakeLists.txt所在的源代码目录路径,它的值会随着CMake在不同目录下处理CMakeLists.txt文件而变化
CMAKE_CURRENT_SOURCE_DIRPROJECT_SOURCE_DIR是CMake构建系统中的两个常用变量,它们在定义、位置变化以及用途**等方面存在差异。具体分析如下:
定义
CMAKE_CURRENT_SOURCE_DIR:这是当前正在处理的CMakeLists.txt所在的源代码目录路径。它的值会随着CMake在不同目录下处理CMakeLists.txt文件而变化。
PROJECT_SOURCE_DIR:这个变量指向包含最近一次调用project()命令的CMakeLists.txt文件的目录。在多项目情况下,每个子项目(每次调用project()命令)都会重新设置PROJECT_SOURCE_DIR
位置变化
CMAKE_CURRENT_SOURCE_DIR:由于它指向当前处理的CMakeLists.txt所在目录,因此其值会在CMake处理不同目录下的文件时改变[4]。
PROJECT_SOURCE_DIR:相对固定,只有在新的project()命令被执行时才会更新其值,指向该命令所在目录。
用途
CMAKE_CURRENT_SOURCE_DIR:当需要引用同级或子级目录下的文件时,应该使用CMAKE_CURRENT_SOURCE_DIR[4]。它常用于指定当前目录下的资源文件或配置文件。
PROJECT_SOURCE_DIR:适用于多项目结构,每个子项目可以有自己的PROJECT_SOURCE_DIR,使得每个子项目有独立的源代码目录路径。
综合对比分析,针对实际的项目结构和需求,以下是一些建议:

  • 对于单一目录的项目,通常不需要频繁使用PROJECT_SOURCE_DIRCMAKE_SOURCE_DIR已足够。
  • 在多层次、多项目结构中,合理使用PROJECT_SOURCE_DIR可以带来更好的灵活性和项目管理能力。
  • 当在脚本中定义相对路径时,使用CMAKE_CURRENT_SOURCE_DIR能确保正确解析这些路径。
  • 使用变量时,了解其作用域和适用场景可以避免常见错误,提升构建配置的可维护性。

总的来说,CMAKE_CURRENT_SOURCE_DIR主要用于动态指示当前处理的源目录,而PROJECT_SOURCE_DIR则用于指示最接近的project()命令所在的目录,这在多项目和多层级项目中特别有用。正确使用这两个变量,可以帮助开发者更好地控制项目的构建过程和结构。
PROJECT_SOURCE_DIR、aux_source_directory

cmake_minimum_required(VERSION 3.15)
project(test)

set(SRC main.cpp)

aux_source_directory(${PROJECT_SOURCE_DIR} SRC)
#PROJECT_SOURCE_DIR这个宏的意思是执行Cmake命令后面的路径 如.或则…后 可以理解为根目录
set(EXECUTABLE_OUTPUT_PATH /opt/test_Cmake/build) #设置一个生成的可执行程序的输出目录,没有这个文件夹会自动生成
set(CMAKE_CXX_STANDARD 11) #设置c++标准 是11
add_executable(app ${SRC})

file、CMAKE_CURRENT_SOURCE_DIR

cmake_minimum_required(VERSION 3.15)
project(test)

set(SRC main.cpp)

aux_source_directory(${PROJECT_SOURCE_DIR} SRC)

file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)
#CMAKE_CURRENT_SOURCE_DIR这个宏是指CMakeists.txt所在的路径
set(EXECUTABLE_OUTPUT_PATH /opt/test_Cmake/build) #设置一个生成的可执行程序的输出目录,没有这个文件夹会自动生成
set(CMAKE_CXX_STANDARD 11) #设置c++标准 是11
add_executable(app ${SRC})
头文件、源文件
假设我们有一个程序,它有一个用于计算的功能。我们可以将这个功能分成两部分组成:声明(在头文件中)和实现(在源文件中)。
目录结构
├── build
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ ├── cmake_install.cmake
│ └── Makefile
├── CMakeLists.txt
├── include
│ └── calculate.h
├── src
│ ├── calculate.cpp
│ └── main.cpp
└──
头文件.h
// calculate.h
#ifndef CALCULATE_H
#define CALCULATE_H

// 函数声明
int add(int a, int b);

#endif // CALCULATE_H
相应的实现在文件calculate.cpp中
// calculate.cpp
#include “calculate.h”

// 函数实现
int add(int a, int b) {
return a + b;
}
主程序main.cpp
// main.cpp
#include
#include “calculate.h”

int main() {
int sum = add(3, 4);
std::cout << "The sum is: " << sum << std::endl;
return 0;
}
CMakeLists.txt变化为
cmake_minimum_required(VERSION 3.15)
project(test)

set(SRC main.cpp)

aux_source_directory(${PROJECT_SOURCE_DIR} SRC)

file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
#CMAKE_CURRENT_SOURCE_DIR这个宏是指CMakeists.txt所在的路径
set(EXECUTABLE_OUTPUT_PATH /opt/test_Cmake/build)
#设置一个生成的可执行程序的输出目录,没有这个文件夹会自动生成
set(CMAKE_CXX_STANDARD 11)
#设置c++标准 是11
add_executable(app KaTeX parse error: Expected 'EOF', got '#' at position 144: …al/stage1/build#̲ make [ 33%] Bu…{CMAKE_CURRENT_SOURCE_DIR}/include)
cmake_minimum_required(VERSION 3.15)
project(test)
file(GLOB SRC C M A K E C U R R E N T S O U R C E D I R / s r c / ∗ . c p p ) s e t ( E X E C U T A B L E O U T P U T P A T H / o p t / t e s t C m a k e / b u i l d ) i n c l u d e d i r e c t o r i e s ( {CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) set(EXECUTABLE_OUTPUT_PATH /opt/test_Cmake/build) include_directories( CMAKECURRENTSOURCEDIR/src/.cpp)set(EXECUTABLEOUTPUTPATH/opt/testCmake/build)includedirectories({CMAKE_CURRENT_SOURCE_DIR}/include)
set(CMAKE_CXX_STANDARD 11)
add_executable(app ${SRC})
编译成功
root@zyp:/opt/test_bazel/examples/cpp-tutorial/stage1/build# cmake …
– Configuring done
– Generating done
– Build files have been written to: /opt/test_bazel/examples/cpp-tutorial/stage1/build
root@zyp:/opt/test_bazel/examples/cpp-tutorial/stage1/build# make
Consolidate compiler generated dependencies of target app
[ 33%] Building CXX object CMakeFiles/app.dir/src/calculate.cpp.o
[ 66%] Building CXX object CMakeFiles/app.dir/src/main.cpp.o
[100%] Linking CXX executable /opt/test_Cmake/build/app
[100%] Built target app
root@zyp:/opt/test_Cmake/build# ./app
The sum is: 7
制作静态动态库
静态库STATIC
动态库SHARED
当前目录结构:
root@zyp:/opt/test_Cmake/lib# tree -L 2
.
├── build
│ ├── CMakeCache.txt
│ ├── CMakeFiles
│ ├── cmake_install.cmake
│ └── Makefile
├── CMakeLists.txt
├── include
│ └── calculate.h
└── src
├── calculate.cpp
└── main.cpp
动态库 SHARED
cmake_minimum_required(VERSION 3.15)
project(test)
file(GLOB SRC C M A K E C U R R E N T S O U R C E D I R / s r c / ∗ . c p p ) i n c l u d e d i r e c t o r i e s ( {CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) include_directories( CMAKECURRENTSOURCEDIR/src/.cpp)includedirectories({CMAKE_CURRENT_SOURCE_DIR}/include)
add_library(calc SHARED ${SRC})
编译动态库
oot@zyp:/opt/test_Cmake/lib/build# cmake …
– The C compiler identification is GNU 11.4.0
– The CXX compiler identification is GNU 11.4.0
– Detecting C compiler ABI info
– Detecting C compiler ABI info - done
– Check for working C compiler: /usr/bin/cc - skipped
– Detecting C compile features
– Detecting C compile features - done
– Detecting CXX compiler ABI info
– Detecting CXX compiler ABI info - done
– Check for working CXX compiler: /usr/bin/c++ - skipped
– Detecting CXX compile features
– Detecting CXX compile features - done
– Configuring done
– Generating done
– Build files have been written to: /opt/test_Cmake/lib/build
root@zyp:/opt/test_Cmake/lib/build# make
[ 33%] Building CXX object CMakeFiles/calc.dir/src/calculate.cpp.o
[ 66%] Building CXX object CMakeFiles/calc.dir/src/main.cpp.o
[100%] Linking CXX shared library libcalc.so
[100%] Built target calc

执行make在当前目录build下面生成了一个动态库libcalc.so
root@zyp:/opt/test_Cmake/lib/build# ls
CMakeCache.txt CMakeFiles cmake_install.cmake libcalc.so Makefile
静态库 STATIC
cmake_minimum_required(VERSION 3.15)
project(test)
file(GLOB SRC C M A K E C U R R E N T S O U R C E D I R / s r c / ∗ . c p p ) i n c l u d e d i r e c t o r i e s ( {CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) include_directories( CMAKECURRENTSOURCEDIR/src/.cpp)includedirectories({CMAKE_CURRENT_SOURCE_DIR}/include)
add_library(calc STATIC ${SRC})
编译静态库
root@zyp:/opt/test_Cmake/lib# vim CMakeLists.txt
root@zyp:/opt/test_Cmake/lib# cd build/
root@zyp:/opt/test_Cmake/lib/build# cmake …
– Configuring done
– Generating done
– Build files have been written to: /opt/test_Cmake/lib/build
root@zyp:/opt/test_Cmake/lib/build# make
Consolidate compiler generated dependencies of target calc
[ 33%] Building CXX object CMakeFiles/calc.dir/src/calculate.cpp.o
[ 66%] Building CXX object CMakeFiles/calc.dir/src/main.cpp.o
[100%] Linking CXX static library libcalc.a
[100%] Built target calc
root@zyp:/opt/test_Cmake/lib/build# ls
CMakeCache.txt CMakeFiles cmake_install.cmake libcalc.a libcalc.so Makefile
root@zyp:/opt/test_Cmake/lib/build#
执行make在当前目录build下面生成了一个静态库libcalc.a
LIBRARY_OUTPUT_PATH
指定动态或者静态库生成的文件位置
类似与 set(EXECUTABLE_OUTPUT_PATH /opt/test_Cmake/build) #设置一个生成的可执行程序的输出目录,
cmake_minimum_required(VERSION 3.15)
project(test)
file(GLOB SRC C M A K E C U R R E N T S O U R C E D I R / s r c / ∗ . c p p ) i n c l u d e d i r e c t o r i e s ( {CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) include_directories( CMAKECURRENTSOURCEDIR/src/.cpp)includedirectories({CMAKE_CURRENT_SOURCE_DIR}/include)
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/testlib)
add_library(calc STATIC ${SRC})
编译生成
root@zyp:/opt/test_Cmake/lib/build# make
[ 33%] Building CXX object CMakeFiles/calc.dir/src/calculate.cpp.o
[ 66%] Building CXX object CMakeFiles/calc.dir/src/main.cpp.o
[100%] Linking CXX static library …/testlib/libcalc.a
[100%] Built target calc

生成的文件目录是

${PROJECT_SOURCE_DIR}/testlib

root@zyp:/opt/test_Cmake/lib# ls
build CMakeLists.txt include src testlib
调用库
创建两个目录
root@zyp:/opt/test_Cmake/lib# mkdir staticLib sharedLi
#将静态库、动态库文件复制到对应目录下
root@zyp:/opt/test_Cmake/lib/testlib# cp libcalc.a …/staticLib/
root@zyp:/opt/test_Cmake/lib/testlib# cp libcalc.so …/sharedLib/
root@zyp:/opt/test_Cmake/lib# tree -L 2
.

├── CMakeLists.txt
├── include
│ └── calculate.h
├── sharedLib
│ └── libcalc.so
├── staticLib
│ └── libcalc.a
└── testlib
├── libcalc.a
└── libcalc.so

创建一个测试文件test.cpp 调用动态库
#include
#include “calculate.h”

int main() {
int sum = add(3, 4);
std::cout << "The sum is: " << sum << std::endl;
return 0;
}

注意当前目录写的src已经删除 src下的功能实现文件calculate.cpp与主程序main.cpp都被删除了,所以
注意删除CMakeLists.txt中的file(GLOB SRC ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp)中的src
├── CMakeLists.txt
├── include
│ └── calculate.h
├── sharedLib
│ └── libcalc.so
├── staticLib
│ └── libcalc.a
├── test.cpp
└── testlib
├── libcalc.a
└── libcalc.so

此时的CMakeLists.txt :

cmake_minimum_required(VERSION 3.15)
project(test)
#追踪源文件test.app
file(GLOB SRC C M A K E C U R R E N T S O U R C E D I R / ∗ . c p p ) i n c l u d e d i r e c t o r i e s ( {CMAKE_CURRENT_SOURCE_DIR}/*.cpp) include_directories( CMAKECURRENTSOURCEDIR/.cpp)includedirectories({CMAKE_CURRENT_SOURCE_DIR}/include)
link_libraries(calc) #链接到库文件
#因为库文件不是系统的,需要指定库文件位置
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/staticLib)
add_executable(app1 ${SRC})
编译
root@zyp:/opt/test_Cmake/lib/build# cmake …
– Configuring done
– Generating done
– Build files have been written to: /opt/test_Cmake/lib/build

root@zyp:/opt/test_Cmake/lib/build# make
[ 50%] Building CXX object CMakeFiles/app1.dir/test.cpp.o
[100%] Linking CXX executable app1
[100%] Built target app1

#生成了可执行文件app1
root@zyp:/opt/test_Cmake/lib/build# ls
app1 CMakeCache.txt CMakeFiles cmake_install.cmake Makefile
root@zyp:/opt/test_Cmake/lib/build# ./app1
The sum is: 7

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

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

相关文章

构建LangChain应用程序的示例代码:51、如何使用 Chroma 实现多模态检索增强生成 (RAG)

Chroma 多模态 RAG 许多文档包含多种内容类型&#xff0c;包括文本和图像。 然而&#xff0c;大多数 RAG 应用中&#xff0c;图像中捕获的信息往往被忽略。 随着多模态 LLM 的出现&#xff0c;如 GPT-4V&#xff0c;值得考虑如何在 RAG 中利用图像&#xff1a; 选项 1&…

如何在网络抓取过程中绕过 CAPTCHA 和 reCAPTCHA?

什么是 CAPTCHA&#xff1f; CAPTCHA&#xff0c;全称为 “Completely Automated Public Turing test to tell Computers and Humans Apart”&#xff08;完全自动化的公共图灵测试以区分计算机和人类&#xff09;&#xff0c;是一种用于识别网站访问者是否为真实人的测试。 这…

k8s学习--k8s群集ELK日志收集部署最详细的过程与应用(收集k8s群集日志)(图形化界面手把手教学)

文章目录 FilebeatFilebeat主要特点Filebeat使用场景 ELK简介Elasticsearch简介Elasticsearch主要特点Elasticsearch使用场景 Logstash简介Logstash主要特点Logstash使用场景 Kibana简介Kibana主要特点Kibana使用场景 简单理解 环境一、ELK集群部署1.软件安装2.软件配置及启动(…

Gitlab代码管理工具安装配置

前言&#xff1a; 没有真正的证书与域名建议使用httpip的方式在内网使用&#xff0c;不建议使用假的域名地址 一、安装前配置 #更改主机域名 hostnamectl set-hostname gitlab.dome.com bash #配置hosts 底部添加下面内容 vim /etc/hosts ############################ ip gi…

软件功能测试基础知识大揭秘,功能测试报告就找专业软件测评机构

软件功能测试是以软件产品的需求规格为基础&#xff0c;通过对软件功能的逐个测试&#xff0c;验证软件是否符合需求规格&#xff0c;是否能够正常执行各项功能操作。对于软件产品而言&#xff0c;功能测试是一项至关重要的工作&#xff0c;它能够发现软件中存在的功能缺陷、错…

104.二叉树的最大深度

给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;root [1,null,2] 输出…

10、matlab中字符、数字、矩阵、字符串和元胞合并为字符串并将字符串以不同格式写入读出excel

1、前言 在 MATLAB 中&#xff0c;可以使用不同的数据类型&#xff08;字符、数字、矩阵、字符串和元胞&#xff09;合并为字符串&#xff0c;然后将字符串以不同格式写入 Excel 文件。 以下是一个示例代码&#xff0c;展示如何将不同数据类型合并为字符串&#xff0c;并以不…

以智领航 鸿翼助力企业构筑智能化知识管理体系

全面智能化时代&#xff0c;鸿翼倾力打造“知识管理人工智能”的深度融合之作——鸿翼KM知识管理&#xff0c;植根非结构化数据治理全生命周期&#xff0c;打造出智能高效的知识管理体系&#xff0c;助推企业数智化转型落地。 数字化时代的知识管理 文档是现代企业运行与管理的…

springboot大学生请假管理系统-计算机毕业设计源码17453

摘 要 从20年代开始&#xff0c;计算机疯狂的出现在人们的生活以及工作当中&#xff0c;成为人们生活、工作的好帮手&#xff0c;计算机深入到每家每户当中&#xff0c;网络办公&#xff0c;网络教学更是替换了传统手工记录管理的方式&#xff0c;使用计算机办公可以不必局限于…

Vue3轻松创建交互式仪表盘

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 基于 Plotly.js 的 Vue 仪表盘组件 应用场景介绍 仪表盘是一种交互式可视化工具&#xff0c;用于监控和分析关键指标。它广泛应用于各种行业&#xff0c;例如金融、医疗保健和制造业。 代码基本功能介绍 本…

linux快捷键

快捷键 ctrl c 强制停止ctrl d 退出登录history 查看历史命令&#xff01;命令前缀&#xff0c;自动匹配上一个命令ctrl r 搜索历史命令ctrl a | e 光标移动到命令开始或结束ctrl 左箭头 | 右箭头 左右跳单词ctrl | 或者 clear 清屏 &#xff01;命令前缀 例如这里之前…

德旺训练营称重问题

这是考小学的分治策略&#xff0c;小学的分治策略几乎都是分三组。本着这个策略&#xff0c;我们做看看。 第一次称重&#xff1a; 分三组&#xff0c;16,16,17&#xff0c;拿两个16称&#xff0c;得到A情况&#xff0c;一样重&#xff0c;那么假铜钱在那组17个里面。B情况不…

3d打开模型的时候怎么没有灯光?---模大狮模型网

在3D建模与渲染过程中&#xff0c;灯光是至关重要的元素之一&#xff0c;直接影响到最终场景的视觉效果和真实感。然而&#xff0c;有时打开3D模型时可能会发现缺乏适当的灯光设置&#xff0c;这会导致场景显得暗淡或平淡无奇。本文将探讨为何在打开3D模型时可能没有灯光的原因…

AI时代的产品经理的成长指南_pdca循环理论制定ai学习成长计划

一、人人不都是产品经理 大多数人听到“产品经理”这个词&#xff0c;总会联想到“人人都是产品经理”这句话。但实际上产品经理这个岗位并没有那么简单。 用一句话概括产品经理的职责就是“帮助团队交付正确产品给用户的人”。也就是说&#xff0c;产品经理要能凝聚团队的力…

在线JSON可视化工具--改进

先前发布了JSON格式化可视化在线工具&#xff0c;提供图形化界面显示结构关系功能&#xff0c;并提供JSON快速格式化、JSON压缩、快捷复制、下载导出、对存在语法错误的地方能明确显示&#xff0c;而且还支持全屏&#xff0c;极大扩大视野区域。 在线JSON格式化可视化工具 但…

C语言版,链表头插法与尾插法

最近又开始看数据结构与算法&#xff0c;看到这个头插法还真的是头插法&#xff0c;头都搞疼了&#xff0c;略微理解了一些。尾插法还好一些&#xff0c;比较好理解&#xff0c;但是如果深入理解还是可以理解。 头插法核心代码&#xff1a; head->next NULL; s->next h…

windows重装系统

一、下载Ventoy工具&#xff0c;制作启动盘 官网地址&#xff1a;https://www.ventoy.net/cn/download.html 电脑插入用来制作系统盘的U盘&#xff0c;建议大小在8G以上。 双击打开刚解压出来的Ventoy2Disk.exe文件。打开界面如图&#xff1a; 确认U盘&#xff0c;如图&am…

java常用类(3)

目录 一. 正则表达式 二. Math类 三. Random类 四. Date类 五. Calendar类 六. SimpDateFormate类 七. BigInteger类 八. BigDecimal类 一. 正则表达式 正则表达式(Regular Expression)就是用一些特殊的符号去匹配一个字符串是否符合规则,利用String类中的matches()方…

3D Gaussian Splatting代码中的train和render两个文件代码解读

现在来聊一聊训练和渲染是如何进行的 training train.py line 31 def training(dataset, opt, pipe, testing_iterations, saving_iterations, checkpoint_iterations, checkpoint, debug_from):# 初始化第一次迭代的索引为0first_iter 0# 准备输出和日志记录器tb_writer p…

滚珠花键促进汽车产业整体升级与发展!

滚珠花键能够实现高效的传动和连接&#xff0c;确保物体在运动过程中的精确位置和稳定性&#xff0c;被广泛应用于机械制造、航空航天、工业自动化、工业汽车、工业机器人、高速铁路等领域。为各个行业的发展提供了重要支持&#xff0c;尤其是在工业汽车领域中&#xff0c;为我…