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

CMake ctest

CMake学习–ctest全面介绍


1. 环境准备

确保已安装 cmake 和编译工具:

sudo apt update
sudo apt install cmake build-essential

2. 创建示例项目

假设我们要测试一个简单的数学函数 add(),项目结构如下:

math_project/
├── CMakeLists.txt
├── include/
│   └── math.h
├── src/
│   └── math.cpp
└── tests/└── test_math.cpp
文件内容:
  1. include/math.h(函数声明):
#ifndef MATH_H
#define MATH_Hint add(int a, int b);#endif
  1. src/math.cpp(函数实现):
#include "math.h"int add(int a, int b) {return a + b;
}
  1. tests/test_math.cpp(测试代码):
#include "math.h"
#include <iostream>int main() {if (add(2, 3) != 5) {std::cerr << "错误:2 + 3 应该等于 5,但实际得到 " << add(2, 3) << std::endl;return 1; // 返回非零表示测试失败}return 0; // 返回零表示测试成功
}

3. 编写 CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(MathProject)# 添加主库
add_library(math_lib src/math.cpp)
target_include_directories(math_lib PUBLIC include)# 启用测试功能
enable_testing()# 添加测试可执行文件
add_executable(test_math tests/test_math.cpp)
target_link_libraries(test_math math_lib)# 注册测试用例
add_test(NAME math_test COMMAND test_math)

4. 构建并运行测试

# 创建构建目录
mkdir build
cd build# 生成 Makefile
cmake ..# 编译项目
make# 运行所有测试
ctest# 详细输出(可选)
ctest --verbose

5. 输出示例

如果一切正常,你会看到类似以下输出:

Test project /path/to/buildStart 1: math_test
1/1 Test #1: math_test ........................   Passed    0.00 sec100% tests passed, 0 tests failed out of 1

如果测试失败(比如修改 add 函数返回错误值),输出会显示:

1: 错误:2 + 3 应该等于 5,但实际得到 6
1/1 Test #1: math_test ........................***Failed    0.00 sec0% tests passed, 1 tests failed out of 1

6. 高级用法

  • 并行测试:使用 ctest -j NN 是线程数)。
  • 过滤测试:用 -R 按名称过滤,如 ctest -R math
  • 测试超时:在 add_test 后设置超时:
    set_tests_properties(math_test PROPERTIES TIMEOUT 10)
    

7. 使用测试框架(如 Google Test)

如果需要更复杂的测试,可以集成 Google Test:

# 查找 GTest
find_package(GTest REQUIRED)# 添加测试可执行文件
add_executable(gtest_test tests/gtest_test.cpp)
target_link_libraries(gtest_test math_lib GTest::GTest GTest::Main)# 注册测试
add_test(NAME gtest_test COMMAND gtest_test)

通过这个示例,你可以在 Ubuntu 22.04 下快速上手 CMake 的测试功能。实际开发中只需替换为自己的项目和测试逻辑即可。


好的!CMake 的 CTest 是一个用于管理和运行测试的工具,它可以与 CMake 项目无缝集成,自动化测试流程。下面我会从基础到实际用法详细讲解,结合示例帮助你快速上手。


一、CTest 基础概念

  1. 作用

    • 批量运行项目中定义的测试用例。
    • 输出测试结果(通过/失败/耗时等)。
    • 支持并行测试、过滤测试、重试失败测试等高级功能。
  2. 依赖

    • 测试用例需要编译为可执行文件(例如 my_test)。
    • CMakeLists.txt 中通过 enable_testing()add_test() 注册测试。

二、快速入门示例

1. 创建项目

假设项目结构如下:

demo/
├── CMakeLists.txt
└── tests/└── test_demo.cpp
2. 编写测试代码 (test_demo.cpp)
#include <iostream>int main() {int result = 1 + 1;if (result != 2) {std::cerr << "测试失败: 1+1 应该等于 2,但实际得到 " << result << std::endl;return 1; // 非零返回值表示测试失败}return 0; // 零表示成功
}
3. 编写 CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(DemoTest)enable_testing()  # 启用测试功能# 添加测试可执行文件
add_executable(test_demo tests/test_demo.cpp)# 注册测试用例
add_test(NAME my_first_test COMMAND test_demo)
4. 构建并运行测试
mkdir build && cd build
cmake ..
make
ctest  # 运行所有测试

输出结果

Test project /path/to/buildStart 1: my_first_test
1/1 Test #1: my_first_test ..............   Passed    0.00 sec100% tests passed, 0 tests failed out of 1

三、CTest 常用命令和选项

1. 基础命令
  • 运行所有测试

    ctest
    
  • 显示详细输出

    ctest --verbose  # 或 -V
    
  • 并行运行测试(例如使用 4 个线程):

    ctest -j4
    
  • 仅运行特定测试(按名称匹配):

    ctest -R my_first_test  # 正则表达式匹配测试名
    
  • 排除某些测试

    ctest -E another_test  # 排除名为 another_test 的测试
    
  • 重试失败的测试

    ctest --rerun-failed  # 仅重新运行之前失败的测试
    

2. 测试输出和日志
  • 查看测试日志

    cat Testing/Temporary/LastTest.log
    
  • 生成 XML 格式报告(便于 CI 工具解析):

    ctest --output-on-failure --output-junit results.xml
    

3. 测试超时和重试

CMakeLists.txt 中可以为测试设置超时时间:

add_test(NAME my_test COMMAND test_demo)
set_tests_properties(my_test PROPERTIES TIMEOUT 5)  # 超时 5 秒

四、进阶用法:多测试用例与参数传递

1. 定义多个测试用例

修改 CMakeLists.txt

add_test(NAME test_add COMMAND test_demo add)
add_test(NAME test_sub COMMAND test_demo sub)

对应的测试代码需要解析命令行参数:

int main(int argc, char* argv[]) {if (argc < 2) return 1;std::string mode = argv[1];if (mode == "add") {// 测试加法} else if (mode == "sub") {// 测试减法}return 0;
}
2. 运行特定测试
ctest -R test_add  # 仅运行 test_add

五、集成测试框架(如 Google Test)

CTest 可以与其他测试框架(如 Google Test、Catch2)配合使用。以 Google Test 为例:

1. 安装 Google Test
sudo apt install libgtest-dev  # Ubuntu
2. 修改 CMakeLists.txt
find_package(GTest REQUIRED)  # 查找 GTestadd_executable(gtest_test tests/gtest_test.cpp)
target_link_libraries(gtest_test PRIVATE GTest::GTest GTest::Main)add_test(NAME gtest_example COMMAND gtest_test)
3. 测试代码 (gtest_test.cpp)
#include <gtest/gtest.h>TEST(MathTest, Add) {EXPECT_EQ(1 + 1, 2);
}int main(int argc, char** argv) {testing::InitGoogleTest(&argc, argv);return RUN_ALL_TESTS();
}
4. 运行测试
ctest --verbose -R gtest_example

六、实际应用场景

  1. 自动化测试:在 CI/CD 中通过 ctest 自动验证代码。
  2. 调试失败测试:结合 --verbose 和日志文件定位问题。
  3. 性能测试:通过超时设置和耗时统计优化代码。

七、总结

  • 核心步骤
    1. CMakeLists.txt 中注册测试 (add_test)。
    2. 通过 ctest 命令运行测试。
  • 关键选项-j(并行)、-R(过滤)、--rerun-failed(重试失败)。
  • 扩展性:支持自定义测试逻辑和第三方框架。

现在可以尝试在自己的项目中添加测试,体验自动化测试的便利性!


好的!enable_testing()add_test() 是 CMake 中测试功能的核心命令,下面我会详细解释它们的用法,并结合具体示例说明。


一、enable_testing():启用测试功能

作用
  • 激活测试模块:告诉 CMake 项目需要支持测试功能,后续才能使用 add_test() 注册测试。
  • 必须调用:只有在调用 enable_testing() 后,add_test() 注册的测试才能被 CTest 识别。
语法
enable_testing()
注意
  • 位置:通常放在 CMakeLists.txt 的顶层,或至少在所有 add_test() 之前。
  • 作用域:对整个 CMake 项目有效,无需重复调用。

二、add_test():注册测试用例

作用
  • 定义测试:将一个可执行文件(或其他命令)注册为测试用例。
  • 关联到项目:CTest 运行时可以批量执行这些测试。
语法
add_test(NAME <测试名称>        # 自定义测试的唯一标识符(用于过滤、报告)COMMAND <可执行文件>  # 要运行的命令(通常是编译后的测试程序)[WORKING_DIRECTORY <路径>]  # 指定运行测试的工作目录(可选)[CONFIGURATIONS <Debug|Release...>]  # 指定生效的构建类型(可选)
)

三、完整用法示例

1. 项目结构
demo/
├── CMakeLists.txt
├── src/
│   └── main.cpp
└── tests/└── test_demo.cpp
2. 测试代码 (tests/test_demo.cpp)
#include <iostream>int main() {int result = 2 + 3;if (result != 5) {std::cerr << "测试失败: 2+3 应该等于 5,实际得到 " << result << std::endl;return 1; // 非零返回值表示失败}return 0; // 零表示成功
}
3. CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(DemoTest)# 添加主程序(可选,这里仅为示例)
add_executable(main src/main.cpp)# 启用测试功能(必须!)
enable_testing()# 添加测试可执行文件
add_executable(test_demo tests/test_demo.cpp)# 注册测试用例
add_test(NAME arithmetic_test      # 测试名称COMMAND test_demo         # 要运行的命令(即编译后的可执行文件)
)# 可选:设置测试属性(例如超时时间)
set_tests_properties(arithmetic_test PROPERTIES TIMEOUT 10)

四、关键细节说明

1. COMMAND 参数
  • 可执行文件:通常是项目中通过 add_executable() 编译的程序。
  • 传递参数:可以向测试程序传递命令行参数:
    add_test(NAME my_test COMMAND test_demo arg1 arg2)
    
  • 非可执行文件:甚至可以运行脚本或系统命令:
    add_test(NAME system_test COMMAND bash -c "echo Hello")
    
2. 测试名称 (NAME)
  • 唯一性:名称在项目中必须唯一。
  • 过滤测试:通过 ctest -R <名称> 运行特定测试。
3. 测试属性

通过 set_tests_properties() 可以设置测试的额外行为:

set_tests_properties(arithmetic_testPROPERTIESTIMEOUT 5               # 超时时间(秒)WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"  # 运行目录LABELS "quick"          # 标签(用于分类)
)

五、完整操作流程

1. 构建项目
mkdir build && cd build
cmake ..
make
2. 运行测试
ctest# 输出示例:
Test project /path/to/buildStart 1: arithmetic_test
1/1 Test #1: arithmetic_test ..............   Passed    0.00 sec
100% tests passed.
3. 查看详细日志
ctest --verbose# 输出示例:
1: Test command: /path/to/build/test_demo
1: Test timeout computed to be: 10
1: 测试失败: 2+3 应该等于 5,实际得到 6
1/1 Test #1: arithmetic_test ..............***Failed    0.00 sec

六、常见问题解决

1. 测试未找到可执行文件
  • 原因:未正确链接或编译测试程序。
  • 解决:确保 add_executable(test_demo ...) 被正确调用。
2. 测试返回码被忽略
  • CMake 约定:测试程序返回 0 表示成功,非零表示失败。
  • 验证:手动运行测试程序检查返回值:
    ./test_demo
    echo $?  # 输出 0 表示成功
    
3. 测试名称冲突
  • 错误add_test 时出现重复的 NAME
  • 解决:确保每个测试名称唯一。

七、进阶用法

1. 多个测试用例
# 添加多个测试
add_test(NAME test_add COMMAND test_demo add)
add_test(NAME test_sub COMMAND test_demo sub)
2. 依赖其他测试
# 设置测试依赖(需 CMake 3.7+)
set_tests_properties(test_sub PROPERTIES DEPENDS test_add)
3. 集成测试框架(如 Google Test)
find_package(GTest REQUIRED)
add_executable(gtest_test tests/gtest_test.cpp)
target_link_libraries(gtest_test PRIVATE GTest::GTest GTest::Main)
add_test(NAME gtest_demo COMMAND gtest_test)

八、总结

  • enable_testing():必须调用,通常在 CMakeLists.txt 的顶层。
  • add_test():注册测试,核心是定义 NAMECOMMAND
  • 测试属性:通过 set_tests_properties() 控制超时、目录等。

通过这个流程,你可以将任意可执行文件(包括单元测试、脚本等)集成到 CMake 的测试框架中,并通过 ctest 统一管理。


你的观察非常准确!CMake 和 CTest 确实提供了更灵活的命令行操作方式,可以避免频繁切换目录,甚至实现“一气呵成”的构建和测试流程。下面我会详细介绍几种高效用法:


一、更快捷的构建和测试方式

1. 构建阶段:使用 cmake --build 替代 make

直接在项目根目录运行,无需进入 build 目录:

# 生成构建系统(仅首次需要)
cmake -B build -S .  # -B 指定构建目录,-S 指定源码目录# 编译项目(自动调用 make/ninja 等)
cmake --build build  # 相当于在 build 目录执行 make
2. 测试阶段:使用 ctest --test-dir(CMake 3.20+)

直接在项目根目录运行测试:

ctest --test-dir build   # 自动在 build 目录中查找测试
3. 组合命令:构建后立即测试
cmake --build build && ctest --test-dir build

二、完整操作流程示例

假设项目结构如下:

mycpp/
├── CMakeLists.txt
└── tests/└── test_demo.cpp
1. 首次配置和构建
# 生成构建系统并编译
cmake -B build -S .  # 生成构建文件到 build 目录
cmake --build build  # 编译项目
2. 后续迭代开发
# 修改代码后,只需重新编译和测试
cmake --build build && ctest --test-dir build --verbose

三、进阶用法

1. 并行构建和测试
cmake --build build --parallel 4  # 4 线程编译
ctest --test-dir build --parallel 4  # 4 线程并行测试
2. 过滤测试用例
# 仅运行名称包含 "math" 的测试
ctest --test-dir build -R math
3. 生成测试报告
ctest --test-dir build --output-junit report.xml  # 生成 JUnit 格式报告
4. 清理构建产物
cmake --build build --target clean  # 清理编译文件

四、跨平台兼容性

这些命令是跨平台的,适用于:

  • Linux/macOS:自动调用 makeninja
  • Windows:自动调用 MSBuildninja
  • 其他生成器:如 Xcode、Eclipse 等

五、自动化脚本示例

你可以将常用操作封装为脚本(如 run.sh):

#!/bin/bash
set -e  # 遇到错误立即退出# 配置和构建
cmake -B build -S .
cmake --build build --parallel# 运行测试
ctest --test-dir build --output-on-failure# 可选:生成覆盖率报告等后续操作

赋予执行权限后直接运行:

chmod +x run.sh
./run.sh

六、注意事项

  1. CMake 版本要求

    • --test-dir 需要 CMake 3.20+,若版本过低可升级:
      # Ubuntu 升级 CMake
      sudo apt install cmake --upgrade
      
    • 旧版本 CTest 需进入构建目录操作。
  2. 构建目录命名

    • 你可以自由命名构建目录(如 cmake -B mybuild),但需保持一致性。
  3. IDE 集成

    • 大多数 IDE(如 VS Code、CLion)已内置这些命令的快捷操作。

七、完整示例验证

步骤 1:创建项目
mkdir -p mycpp/tests
cd mycpp
步骤 2:编写 CMakeLists.txt
cmake_minimum_required(VERSION 3.20)
project(MyDemo)enable_testing()add_executable(test_demo tests/test_demo.cpp)
add_test(NAME demo_test COMMAND test_demo)
步骤 3:编写测试代码 tests/test_demo.cpp
#include <iostream>int main() {if (1 + 1 == 2) {std::cout << "测试通过!" << std::endl;return 0;} else {std::cerr << "测试失败!" << std::endl;return 1;}
}
步骤 4:运行完整流程
# 在项目根目录执行
cmake -B build
cmake --build build
ctest --test-dir build --verbose

输出示例

...
1: 测试通过!
1/1 Test #1: demo_test ..............   Passed    0.00 sec

通过这种方式,你可以完全避免手动切换目录,实现更高效的开发测试循环!


你提到的 cmake --build build --target test 是一个常见的误解,它的行为取决于 CMake 生成的具体构建系统(如 Makefile 或 Ninja)。下面我会详细解释它的含义、潜在问题,并提供更推荐的用法。


1. cmake --build build --target test 的含义

  • --build build:指定在 build 目录中执行构建操作。
  • --target test:尝试构建名为 test 的目标(类似于 make test)。
预期行为:
  • 如果构建系统(如 Makefile)中存在名为 test 的目标,该命令会执行该目标定义的操作(例如运行测试)。
  • 但默认情况下,CMake 不会生成名为 test 的构建目标,除非你在 CMakeLists.txt 中手动定义了它。

2. 为什么这个命令可能无效?

默认情况下:
  • CMake 不会生成 test 目标:当你调用 enable_testing()add_test() 时,CMake 会生成 CTestTestfile.cmake,但不会创建 test 构建目标。
  • 历史兼容性:某些旧项目或教程可能通过 add_custom_target(test ...) 手动创建了 test 目标,但这并非 CMake 的官方推荐做法。
典型错误输出:
cmake --build build --target test
# 输出可能为:
# make: *** No rule to make target 'test'.  Stop.
# 或 ninja: error: unknown target 'test'

3. 官方推荐测试方式

CMake 的测试功能应通过 ctest 命令运行,而非构建目标。以下是正确用法:

直接运行所有测试:
ctest --test-dir build  # CMake 3.20+ 支持,推荐!
# 或
cd build && ctest && cd ..  # 传统方式
构建后立即测试:
cmake --build build && ctest --test-dir build

4. 如何让 --target test 生效?

如果你坚持想通过 cmake --build build --target test 触发测试,需要手动在 CMakeLists.txt 中添加自定义目标:

修改 CMakeLists.txt
enable_testing()# 添加一个名为 "test" 的自定义目标,关联到 ctest
add_custom_target(testCOMMAND ${CMAKE_CTEST_COMMAND} --output-on-failureWORKING_DIRECTORY ${CMAKE_BINARY_DIR}COMMENT "Running tests..."
)
操作效果:
  • 此时 cmake --build build --target test 会调用 ctest
  • 但此操作冗余,直接使用 ctest 更简洁。

5. 为什么推荐用 ctest 而不是 --target test

  • 标准化ctest 是 CMake 官方测试工具,与 add_test() 无缝集成。
  • 功能丰富:支持过滤测试 (-R)、并行测试 (-j)、重试失败 (--rerun-failed) 等。
  • 跨平台一致性:无论底层是 Makefile、Ninja 还是 Visual Studio,ctest 用法一致。

6. 完整操作示例

项目结构:
myproject/
├── CMakeLists.txt
└── tests/└── test_demo.cpp
CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyProject)enable_testing()add_executable(test_demo tests/test_demo.cpp)
add_test(NAME my_test COMMAND test_demo)
test_demo.cpp
#include <iostream>
int main() {std::cout << "测试通过!" << std::endl;return 0;
}
构建并测试:
# 生成构建系统
cmake -B build# 编译项目
cmake --build build# 运行测试(推荐方式)
ctest --test-dir build --output-on-failure

7. 总结

  • 避免使用 cmake --build build --target test,除非你明确添加了自定义的 test 目标。
  • 始终优先使用 ctest --test-dir build(CMake 3.20+)或 cd build && ctest
  • 测试配置的核心是 enable_testing()add_test(),与构建目标无关。

--output-on-failure 是 CTest 的一个常用选项,它的作用是 在测试失败时自动输出测试程序的详细日志。这个选项可以帮助你快速定位测试失败的原因,而无需手动查看日志文件。


具体行为

  • 默认情况下

    • 如果测试通过,CTest 只会显示 Passed,不会打印测试程序的输出(例如 stdoutstderr)。
    • 如果测试失败,CTest 只会显示 Failed,但仍然不显示失败时的详细输出(你可能需要手动查看日志)。
  • 使用 --output-on-failure

    • 如果测试通过,行为和默认一致(不打印输出)。
    • 如果测试失败,自动打印该测试的所有输出(包括 stdoutstderr),直接显示在终端中。

对比其他选项

  • --verbose(或 -V

    • 无论测试是否通过,都会打印所有测试的完整输出。
    • 适合需要实时跟踪所有测试细节的场景(但输出可能非常多)。
  • --output-on-failure

    • 仅在测试失败时打印输出
    • 适合大多数调试场景,既能减少信息干扰,又能快速定位失败原因。

使用示例

# 运行测试,仅在失败时打印详细日志
ctest --test-dir build --output-on-failure# 组合其他选项(如并行测试)
ctest --test-dir build --output-on-failure -j4  # 4 线程并行运行

实际场景演示

假设有一个测试程序 test_math,其代码逻辑如下:

#include <iostream>
int main() {std::cout << "开始测试..." << std::endl;if (1 + 1 != 2) {std::cerr << "错误:1+1 不等于 2" << std::endl;return 1; // 失败}std::cout << "测试通过!" << std::endl;return 0; // 成功
}
1. 测试失败时的输出
$ ctest --test-dir build --output-on-failure
...
1/1 Test #1: math_test .....................***Failed    0.01 sec输出:
开始测试...
错误:1+1 不等于 2
2. 测试成功时的输出
$ ctest --test-dir build --output-on-failure
...
1/1 Test #1: math_test .....................   Passed    0.01 sec
(没有多余输出)

为什么要用它?

  1. 减少干扰:成功时不打印冗余信息,保持终端干净。
  2. 快速调试:失败时直接看到错误输出,无需手动查找日志文件。
  3. 自动化友好:在 CI/CD 中结合 --output-junit 生成报告时,失败日志会被自动捕获。

查看完整日志

如果需要查看所有测试的完整日志(无论成功与否),可以用:

ctest --test-dir build --verbose

总结

  • --output-on-failure:仅在失败时打印日志,是调试测试的黄金选项。
  • --verbose:无条件打印所有日志,适合深度调试。
  • 结合使用:在自动化脚本中,可以同时生成 JUnit 报告和保留失败日志:
    ctest --test-dir build --output-on-failure --output-junit test-results.xml
    

相关文章:

CMake ctest

CMake学习–ctest全面介绍 1. 环境准备 确保已安装 cmake 和编译工具&#xff1a; sudo apt update sudo apt install cmake build-essential2. 创建示例项目 假设我们要测试一个简单的数学函数 add()&#xff0c;项目结构如下&#xff1a; math_project/ ├── CMakeList…...

全面解析React内存泄漏:原因、解决方案与最佳实践

在开发React应用时&#xff0c;内存泄漏是一个常见但容易被忽视的问题。如果处理不当&#xff0c;它会导致应用性能下降、卡顿甚至崩溃。由于React的组件化特性&#xff0c;许多开发者可能没有意识到某些操作&#xff08;如事件监听、异步请求、定时器等&#xff09;在组件卸载…...

JavaScript学习教程,从入门到精通,Ajax数据交换格式与跨域处理(26)

Ajax数据交换格式与跨域处理 一、Ajax数据交换格式 1. XML (eXtensible Markup Language) XML是一种标记语言&#xff0c;类似于HTML但更加灵活&#xff0c;允许用户自定义标签。 特点&#xff1a; 可扩展性强结构清晰数据与表现分离文件体积相对较大 示例代码&#xff1…...

【FreeRTOS】事件标志组

文章目录 1 简介1.1事件标志1.2事件组 2事件标志组API2.1创建动态创建静态创建 2.2 删除事件标志组2.3 等待事件标志位2.4 设置事件标志位在任务中在中断中 2.5 清除事件标志位在任务中在中断中 2.6 获取事件组中的事件标志位在任务中在中断中 2.7 函数xEventGroupSync 3 事件标…...

超级扩音器手机版:随时随地,大声说话

在日常生活中&#xff0c;我们常常会遇到手机音量太小的问题&#xff0c;尤其是在嘈杂的环境中&#xff0c;如KTV、派对或户外活动时&#xff0c;手机自带的音量往往难以满足需求。今天&#xff0c;我们要介绍的 超级扩音器手机版&#xff0c;就是这样一款由上海聚告德业文化发…...

【数据可视化-27】全球网络安全威胁数据可视化分析(2015-2024)

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...

【6G 开发】NV NGC

配置 生成密钥 API Keys 生成您自己的 API 密钥&#xff0c;以便通过 Docker 客户端或通过 NGC CLI 使用 Secrets Manager、NGC Catalog 和 Private Registry 的 NGC 服务 以下个人 API 密钥已成功生成&#xff0c;可供此组织使用。这是唯一一次显示您的密钥。 请妥善保管您的…...

计算机视觉各类任务评价指标详解

文章目录 计算机视觉各类任务评价指标详解一、图像分类&#xff08;Image Classification&#xff09;常用指标1. 准确率&#xff08;Accuracy&#xff09;2. Top-k Accuracy3. 精确率&#xff08;Precision&#xff09;、召回率&#xff08;Recall&#xff09;、F1 分数&#…...

SIEMENS PLC程序解读 -Serialize(序列化)SCATTER_BLK(数据分散)

1、程序数据 第12个字节 PI 2、程序数据 第16个字节 PI 3、程序数据 第76个字节 PO 4、程序代码 2、程序解读 图中代码为 PLC 梯形图&#xff0c;主要包含以下指令及功能&#xff1a; Serialize&#xff08;序列化&#xff09;&#xff1a; 将 SRC_VARIABLE&#xff…...

宁德时代25年时代长安动力电池社招入职测评SHL题库Verify测评语言理解数字推理真题

测试分为语言和数字两部分&#xff0c;测试时间各为17分钟&#xff0c;测试正式开始后不能中断或暂停...

python源码打包为可执行的exe文件

文章目录 简单的方式&#xff08;PyInstaller&#xff09;特点步骤安装 PyInstaller打包脚本得到.exe文件 简单的方式&#xff08;PyInstaller&#xff09; 特点 支持 Python 3.6打包为单文件&#xff08;–onefile&#xff09;或文件夹形式自动处理依赖项 步骤 安装 PyIns…...

数据加密技术:从对称加密到量子密码的原理与实战

数据加密技术&#xff1a;从对称加密到量子密码的原理与实战 在网络安全体系中&#xff0c;数据加密是保护信息机密性、完整性的核心技术。从古代的凯撒密码到现代的量子加密&#xff0c;加密技术始终是攻防博弈的关键战场。本文将深入解析对称加密、非对称加密、哈希函数的核…...

高性能的开源网络入侵检测和防御引擎:Suricata介绍

一、Debian下使用Suricata 相较于Windows&#xff0c;Linux环境对Suricata的支持更加完善&#xff0c;操作也更为便捷。 1. 安装 Suricata 在Debian系统上&#xff0c;你可以通过包管理器 apt 轻松安装 Suricata。 更新软件包列表: sudo apt update安装 Suricata: sudo apt …...

【硬核解析:基于Python与SAE J1939-71协议的重型汽车CAN报文解析工具开发实战】

引言&#xff1a;重型汽车CAN总线的数据价值与挑战 随着汽车电子化程度的提升&#xff0c;控制器局域网&#xff08;CAN总线&#xff09;已成为重型汽车的核心通信网络。不同控制单元&#xff08;ECU&#xff09;通过CAN总线实时交互海量报文数据&#xff0c;这些数据隐藏着车…...

React类组件与React Hooks写法对比

React 类组件 vs Hooks 写法对比 分类类组件&#xff08;Class Components&#xff09;函数组件 Hooks组件定义class Component extends React.Componentconst Component () > {}状态管理this.state this.setState()useState()生命周期componentDidMount, componentDidU…...

Uniapp 自定义 Tabbar 实现教程

Uniapp 自定义 Tabbar 实现教程 1. 简介2. 实现步骤2.1 创建自定义 Tabbar 组件2.2 配置 pages.json2.3 在 App.vue 中引入组件 3. 实现过程中的关键点3.1 路由映射3.2 样式设计3.3 图标处理 4. 常见问题及解决方案4.1 页面跳转问题4.2 样式适配问题4.3 性能优化 5. 扩展功能5.…...

记录一次使用面向对象的C语言封装步进电机驱动

简介 (2025/4/21) 本库对目前仅针对TB6600驱动下的42步进电机的基础功能进行了一定的封装, 也是我初次尝试以面向对象的思想去编写嵌入式代码, 和直流电机的驱动步骤相似在调用stepmotor_attach()函数和stepmotor_init()函数之后仅通过结构体数组stepm然后指定枚举变量中的id即…...

Spark-streaming核心编程

1.导入依赖‌&#xff1a; <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-streaming-kafka-0-10_2.12</artifactId> <version>3.0.0</version> </dependency> 2.编写代码‌&#xff1a; 创建Sp…...

Exposure Adjusted Incidence Rate (EAIR) 暴露调整发病率:精准量化疾病风险

1. 核心概念 1.1 传统发病率的局限性 1.1.1 公式与定义 传统发病率公式为新发病例数除以总人口数乘以观察时间。例如在某社区观察1年,有10例新发病例,总人口1000人,发病率即为10/10001=0.01。 此公式假设所有个体暴露时间和风险相同,但实际中个体差异大,如部分人暴露时间…...

vue3+TS+echarts 折线图

需要实现的效果如下 <script setup lang"ts" name"RepsSingleLineChart">import * as echarts from echartsimport { getInitecharts } from /utils/echartimport type { EChartsOption } from echarts// 定义 props 类型interface Props {id: strin…...

MYSQL中为什么不建议delete数据

在 MySQL 中不建议频繁使用 delete 删除数据的原因主要在于性能、数据安全等方面的问题&#xff0c;以下是具体介绍&#xff1a; 性能问题 磁盘空间与碎片&#xff1a;delete 操作只是将数据标记为 “已删除”&#xff0c;并不会立即释放磁盘空间&#xff0c;频繁执行会导致大量…...

Linux多线程技术

什么是线程 在一个程序里的多执行路线就是线程。线程是进程中的最小执行单元&#xff0c;可理解为 “进程内的一条执行流水线”。 进程和线程的区别 进程是资源分配的基本单位&#xff0c;线程是CPU调度的基本单位。 fork创建出一个新的进程&#xff0c;会创建出一个新的拷贝&…...

12个HPC教程汇总!从入门到实战,覆盖分子模拟/材料计算/生物信息分析等多个领域

在科学研究、工程仿真、人工智能和大数据分析等领域&#xff0c;高性能计算 (High Performance Computing, HPC) 正扮演着越来越重要的角色。它通过并行处理、大规模计算资源的整合&#xff0c;极大提升了计算效率&#xff0c;使原本耗时数日的任务能够在数小时内完成。 随着计…...

[OpenGL] Lambertian材质漫反射BRDF方程的解释与推导

一、简介 本文简单的介绍了 Physical Based Rendering, PBR 中的 Lambertian 材质漫反射BRDF公式 f r l a m b e r t i a n c d i f f π fr_{lambertian}\frac{c_{diff}}{\pi} frlambertian​πcdiff​​的推导。 二、漫反射项 根据 渲染方程&#xff1a; L o ( v ) ∫ …...

小火电视桌面TV版下载-小火桌面纯净版下载-官方历史版本安装包

别再费心地寻找小火桌面的官方历史版本安装包啦&#xff0c;试试乐看家桌面吧&#xff0c;它作为纯净版本的第三方桌面&#xff0c;具有诸多优点。 界面简洁纯净&#xff1a;乐看家桌面设计简洁流畅&#xff0c;页面简洁、纯净无广告&#xff0c;为用户打造了一个干净的电视操…...

VSFTPD+虚拟用户+SSL/TLS部署安装全过程(踩坑全通)

Author : Spinach | GHB Link : http://blog.csdn.net/bocai8058文章目录 前言准备配置虚拟用户1.创建虚拟用户列表文件2.生成数据库文件3.设置虚拟用户独立访问权限 配置PAM认证1.创建PAM配置文件2.测试PAM认证 创建虚拟用户映射的系统用户生成SSL/TLS证书配置VSFTPD服务1…...

07 Python 字符串全解析

文章目录 一. 字符串的定义二. 字符串的基本用法1. 访问字符串中的字符2. 字符串切片3. 字符串拼接4. 字符串重复5.字符串比较6.字符串成员运算 三. 字符串的常用方法1. len() 函数2. upper() 和 lower() 方法3. strip() 方法4. replace() 方法5. split() 方法 四. 字符串的进阶…...

androidstudio安装配置

B站配置视频AndroidStudio安装配置教程&#xff08;最新版本教程&#xff09;3分钟搞定 快速安装使用_哔哩哔哩_bilibili 1、环境变量 D:\AndroidSdk ANDROID_HOME ANDROID_SDK_HOME 2、新建 3、配置 distributionUrlhttps://mirrors.cloud.tencent.com/gradle/gradle-8.11.1-…...

全面解析 MCP(Model Context Protocol):AI 大模型的“万能连接器”

一、MCP 的定义与技术定位 **MCP(Model Context Protocol,模型上下文协议)**是由 Anthropic 公司于 2024 年 11 月推出的开源协议,旨在为 AI 大模型与外部数据源、工具之间建立标准化连接通道。它被业界称为 “AI 的 USB-C 接口”,通过统一的通信协议和数据结构,解决大模…...

《AI大模型趣味实战》基于RAG向量数据库的知识库AI问答助手设计与实现

基于RAG向量数据库的知识库AI问答助手设计与实现 引言 随着大语言模型&#xff08;LLM&#xff09;技术的快速发展&#xff0c;构建本地知识库AI问答助手已成为许多企业级应用的需求。本研究报告将详细介绍如何基于FLASK开发一个使用本地OLLAMA大模型底座的知识库AI问答助手&…...