cmake 之 CMakeLists.txt 中的函数是从哪里来的
我们都知道,cmake会解释执行 CMakeLists.txt 以及其他 *.cmake 脚本,
这里先给出一个“先验” 的知识点:
任何一个独立脚本或脚本函数命令的执行,都是通过 CPP 函数 RunListFile(...) 调用的
void cmMakefile::RunListFile(cmListFile const& listFile,std::string const& filenametoread,DeferCommands* defer);
所以可以debug 版本 cmake 中,在这里打断点。
0,从简单应用示例开始
在Linux 中,
源代码: main.c
#include <stdio.h>
int main()
{printf("Hello World from Main!\n");return 0;
}
CMakeLists.txt 如下:
PROJECT(HELLO)
SET(SRC_LIST main.c)
MESSAGE(STATUS "src =" ${SRC_LIST})
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir " ${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})
配置,编译,运行:
mkdir build
cd build
cmake ..
make
./hello
效果图:
1,cmake 内置关键控制字和命令
使用 CPP 代码定义了其功能
比如,如下这些函数是哪里来的:
PROJECT(...)
SET(...)
MESSAGE(...)
如上这些是 cmake 的内置函数命令,定义在CPP文件:
cmake-3.29.2/Source/cmCommands.cxx
该文件内容放在文末供参考。
源代码文件中存在如下两个定义函数,定义了一大批 CMakeLists.txt 中可以使用的关键字和内置函数命令:
void GetScriptingCommands(cmState* state)
{state->AddFlowControlCommand("break", cmBreakCommand);state->AddFlowControlCommand("continue", cmContinueCommand);state->AddFlowControlCommand("foreach", cmForEachCommand);state->AddFlowControlCommand("function", cmFunctionCommand);state->AddFlowControlCommand("if", cmIfCommand);state->AddFlowControlCommand("macro", cmMacroCommand);state->AddFlowControlCommand("return", cmReturnCommand);state->AddFlowControlCommand("while", cmWhileCommand);state->AddFlowControlCommand("block", cmBlockCommand);state->AddBuiltinCommand("cmake_language", cmCMakeLanguageCommand);state->AddBuiltinCommand("cmake_minimum_required", cmCMakeMinimumRequired);state->AddBuiltinCommand("cmake_path", cmCMakePathCommand);...
void GetProjectCommands(cmState* state)
{state->AddBuiltinCommand("add_compile_definitions",cmAddCompileDefinitionsCommand);state->AddBuiltinCommand("add_custom_command", cmAddCustomCommandCommand);state->AddBuiltinCommand("add_custom_target", cmAddCustomTargetCommand);state->AddBuiltinCommand("add_definitions", cmAddDefinitionsCommand);state->AddBuiltinCommand("add_dependencies", cmAddDependenciesCommand);state->AddBuiltinCommand("add_executable", cmAddExecutableCommand);state->AddBuiltinCommand("add_library", cmAddLibraryCommand);state->AddBuiltinCommand("add_subdirectory", cmAddSubDirectoryCommand);state->AddBuiltinCommand("add_test", cmAddTestCommand);state->AddBuiltinCommand("build_command", cmBuildCommand);state->AddBuiltinCommand("create_test_sourcelist", cmCreateTestSourceList);state->AddBuiltinCommand("define_property", cmDefinePropertyCommand);state->AddBuiltinCommand("enable_language", cmEnableLanguageCommand);state->AddBuiltinCommand("enable_testing", cmEnableTestingCommand);...
2,用户自定义 函数命令 function
除了这些之外,其余的就是用户按照脚本语法自己定义的函数。
类似 MLIR 项目中,在 LLVM - MLIR 的编译产物中,提供了一个函数 mlir_tablegen(),于文件:
local/llvm/lib/cmake/mlir/AddMLIR.cmake
其用户自定义方式如下:
从函数名可以看出,用户自定义函数命令的关键字为 function( new_COMMAND_NAME, parameters)
3,使用macro 定义的脚本命令
除了这两类,还有一部分想 check_language()这样的命令,也是cmake 官方定义的,于如下文件中:./cmake-3.29.2/Modules/CheckLanguage.cmake
4,cmCommands.cxx 内容
/* Distributed under the OSI-approved BSD 3-Clause License. See accompanyingfile Copyright.txt or https://cmake.org/licensing for details. */#include "cmCommands.h"#include <cm/memory>#include "cmAddCompileDefinitionsCommand.h"
#include "cmAddCustomCommandCommand.h"
#include "cmAddCustomTargetCommand.h"
#include "cmAddDefinitionsCommand.h"
#include "cmAddDependenciesCommand.h"
#include "cmAddExecutableCommand.h"
#include "cmAddLibraryCommand.h"
#include "cmAddSubDirectoryCommand.h"
#include "cmAddTestCommand.h"
#include "cmBlockCommand.h"
#include "cmBreakCommand.h"
#include "cmBuildCommand.h"
#include "cmCMakeLanguageCommand.h"
#include "cmCMakeMinimumRequired.h"
#include "cmCMakePathCommand.h"
#include "cmCMakePolicyCommand.h"
#include "cmConfigureFileCommand.h"
#include "cmContinueCommand.h"
#include "cmCreateTestSourceList.h"
#include "cmDefinePropertyCommand.h"
#include "cmEnableLanguageCommand.h"
#include "cmEnableTestingCommand.h"
#include "cmExecProgramCommand.h"
#include "cmExecuteProcessCommand.h"
#include "cmFileCommand.h"
#include "cmFindFileCommand.h"
#include "cmFindLibraryCommand.h"
#include "cmFindPackageCommand.h"
#include "cmFindPathCommand.h"
#include "cmFindProgramCommand.h"
#include "cmForEachCommand.h"
#include "cmFunctionCommand.h"
#include "cmGetCMakePropertyCommand.h"
#include "cmGetDirectoryPropertyCommand.h"
#include "cmGetFilenameComponentCommand.h"
#include "cmGetPropertyCommand.h"
#include "cmGetSourceFilePropertyCommand.h"
#include "cmGetTargetPropertyCommand.h"
#include "cmGetTestPropertyCommand.h"
#include "cmIfCommand.h"
#include "cmIncludeCommand.h"
#include "cmIncludeDirectoryCommand.h"
#include "cmIncludeGuardCommand.h"
#include "cmIncludeRegularExpressionCommand.h"
#include "cmInstallCommand.h"
#include "cmInstallFilesCommand.h"
#include "cmInstallTargetsCommand.h"
#include "cmLinkDirectoriesCommand.h"
#include "cmListCommand.h"
#include "cmMacroCommand.h"
#include "cmMakeDirectoryCommand.h"
#include "cmMarkAsAdvancedCommand.h"
#include "cmMathCommand.h"
#include "cmMessageCommand.h"
#include "cmOptionCommand.h"
#include "cmParseArgumentsCommand.h"
#include "cmPolicies.h"
#include "cmProjectCommand.h"
#include "cmReturnCommand.h"
#include "cmSeparateArgumentsCommand.h"
#include "cmSetCommand.h"
#include "cmSetDirectoryPropertiesCommand.h"
#include "cmSetPropertyCommand.h"
#include "cmSetSourceFilesPropertiesCommand.h"
#include "cmSetTargetPropertiesCommand.h"
#include "cmSetTestsPropertiesCommand.h"
#include "cmSiteNameCommand.h"
#include "cmState.h"
#include "cmStringCommand.h"
#include "cmSubdirCommand.h"
#include "cmTargetCompileDefinitionsCommand.h"
#include "cmTargetCompileFeaturesCommand.h"
#include "cmTargetCompileOptionsCommand.h"
#include "cmTargetIncludeDirectoriesCommand.h"
#include "cmTargetLinkLibrariesCommand.h"
#include "cmTargetLinkOptionsCommand.h"
#include "cmTargetPrecompileHeadersCommand.h"
#include "cmTargetSourcesCommand.h"
#include "cmTryCompileCommand.h"
#include "cmTryRunCommand.h"
#include "cmUnsetCommand.h"
#include "cmWhileCommand.h"#if !defined(CMAKE_BOOTSTRAP)
# include "cmAddCompileOptionsCommand.h"
# include "cmAddLinkOptionsCommand.h"
# include "cmAuxSourceDirectoryCommand.h"
# include "cmBuildNameCommand.h"
# include "cmCMakeHostSystemInformationCommand.h"
# include "cmExportCommand.h"
# include "cmExportLibraryDependenciesCommand.h"
# include "cmFLTKWrapUICommand.h"
# include "cmFileAPICommand.h"
# include "cmIncludeExternalMSProjectCommand.h"
# include "cmInstallProgramsCommand.h"
# include "cmLinkLibrariesCommand.h"
# include "cmLoadCacheCommand.h"
# include "cmLoadCommandCommand.h"
# include "cmOutputRequiredFilesCommand.h"
# include "cmQTWrapCPPCommand.h"
# include "cmQTWrapUICommand.h"
# include "cmRemoveCommand.h"
# include "cmRemoveDefinitionsCommand.h"
# include "cmSourceGroupCommand.h"
# include "cmSubdirDependsCommand.h"
# include "cmTargetLinkDirectoriesCommand.h"
# include "cmUseMangledMesaCommand.h"
# include "cmUtilitySourceCommand.h"
# include "cmVariableRequiresCommand.h"
# include "cmVariableWatchCommand.h"
# include "cmWriteFileCommand.h"
#endifvoid GetScriptingCommands(cmState* state)
{state->AddFlowControlCommand("break", cmBreakCommand);state->AddFlowControlCommand("continue", cmContinueCommand);state->AddFlowControlCommand("foreach", cmForEachCommand);state->AddFlowControlCommand("function", cmFunctionCommand);state->AddFlowControlCommand("if", cmIfCommand);state->AddFlowControlCommand("macro", cmMacroCommand);state->AddFlowControlCommand("return", cmReturnCommand);state->AddFlowControlCommand("while", cmWhileCommand);state->AddFlowControlCommand("block", cmBlockCommand);state->AddBuiltinCommand("cmake_language", cmCMakeLanguageCommand);state->AddBuiltinCommand("cmake_minimum_required", cmCMakeMinimumRequired);state->AddBuiltinCommand("cmake_path", cmCMakePathCommand);state->AddBuiltinCommand("cmake_policy", cmCMakePolicyCommand);state->AddBuiltinCommand("configure_file", cmConfigureFileCommand);state->AddBuiltinCommand("execute_process", cmExecuteProcessCommand);state->AddBuiltinCommand("file", cmFileCommand);state->AddBuiltinCommand("find_file", cmFindFile);state->AddBuiltinCommand("find_library", cmFindLibrary);state->AddBuiltinCommand("find_package", cmFindPackage);state->AddBuiltinCommand("find_path", cmFindPath);state->AddBuiltinCommand("find_program", cmFindProgram);state->AddBuiltinCommand("get_cmake_property", cmGetCMakePropertyCommand);state->AddBuiltinCommand("get_directory_property",cmGetDirectoryPropertyCommand);state->AddBuiltinCommand("get_filename_component",cmGetFilenameComponentCommand);state->AddBuiltinCommand("get_property", cmGetPropertyCommand);state->AddBuiltinCommand("include", cmIncludeCommand);state->AddBuiltinCommand("include_guard", cmIncludeGuardCommand);state->AddBuiltinCommand("list", cmListCommand);state->AddBuiltinCommand("make_directory", cmMakeDirectoryCommand);state->AddBuiltinCommand("mark_as_advanced", cmMarkAsAdvancedCommand);state->AddBuiltinCommand("math", cmMathCommand);state->AddBuiltinCommand("message", cmMessageCommand);state->AddBuiltinCommand("option", cmOptionCommand);state->AddBuiltinCommand("cmake_parse_arguments", cmParseArgumentsCommand);state->AddBuiltinCommand("separate_arguments", cmSeparateArgumentsCommand);state->AddBuiltinCommand("set", cmSetCommand);state->AddBuiltinCommand("set_directory_properties",cmSetDirectoryPropertiesCommand);state->AddBuiltinCommand("set_property", cmSetPropertyCommand);state->AddBuiltinCommand("site_name", cmSiteNameCommand);state->AddBuiltinCommand("string", cmStringCommand);state->AddBuiltinCommand("unset", cmUnsetCommand);state->AddUnexpectedFlowControlCommand("else","An ELSE command was found outside of a proper ""IF ENDIF structure. Or its arguments did not match ""the opening IF command.");state->AddUnexpectedFlowControlCommand("elseif","An ELSEIF command was found outside of a proper ""IF ENDIF structure.");state->AddUnexpectedFlowControlCommand("endforeach","An ENDFOREACH command was found outside of a proper ""FOREACH ENDFOREACH structure. Or its arguments did ""not match the opening FOREACH command.");state->AddUnexpectedFlowControlCommand("endfunction","An ENDFUNCTION command was found outside of a proper ""FUNCTION ENDFUNCTION structure. Or its arguments did not ""match the opening FUNCTION command.");state->AddUnexpectedFlowControlCommand("endif","An ENDIF command was found outside of a proper ""IF ENDIF structure. Or its arguments did not match ""the opening IF command.");state->AddUnexpectedFlowControlCommand("endmacro","An ENDMACRO command was found outside of a proper ""MACRO ENDMACRO structure. Or its arguments did not ""match the opening MACRO command.");state->AddUnexpectedFlowControlCommand("endwhile","An ENDWHILE command was found outside of a proper ""WHILE ENDWHILE structure. Or its arguments did not ""match the opening WHILE command.");state->AddUnexpectedFlowControlCommand("endblock","An ENDBLOCK command was found outside of a proper ""BLOCK ENDBLOCK structure.");#if !defined(CMAKE_BOOTSTRAP)state->AddBuiltinCommand("cmake_host_system_information",cmCMakeHostSystemInformationCommand);state->AddBuiltinCommand("load_cache", cmLoadCacheCommand);state->AddBuiltinCommand("remove", cmRemoveCommand);state->AddBuiltinCommand("variable_watch", cmVariableWatchCommand);state->AddBuiltinCommand("write_file", cmWriteFileCommand);state->AddDisallowedCommand("build_name", cmBuildNameCommand, cmPolicies::CMP0036,"The build_name command should not be called; see CMP0036.");state->AddDisallowedCommand("use_mangled_mesa", cmUseMangledMesaCommand, cmPolicies::CMP0030,"The use_mangled_mesa command should not be called; see CMP0030.");state->AddDisallowedCommand("exec_program", cmExecProgramCommand,cmPolicies::CMP0153,"The exec_program command should not be called; ""see CMP0153. Use execute_process() instead.","Use execute_process() instead.");#endif
}void GetProjectCommands(cmState* state)
{state->AddBuiltinCommand("add_compile_definitions",cmAddCompileDefinitionsCommand);state->AddBuiltinCommand("add_custom_command", cmAddCustomCommandCommand);state->AddBuiltinCommand("add_custom_target", cmAddCustomTargetCommand);state->AddBuiltinCommand("add_definitions", cmAddDefinitionsCommand);state->AddBuiltinCommand("add_dependencies", cmAddDependenciesCommand);state->AddBuiltinCommand("add_executable", cmAddExecutableCommand);state->AddBuiltinCommand("add_library", cmAddLibraryCommand);state->AddBuiltinCommand("add_subdirectory", cmAddSubDirectoryCommand);state->AddBuiltinCommand("add_test", cmAddTestCommand);state->AddBuiltinCommand("build_command", cmBuildCommand);state->AddBuiltinCommand("create_test_sourcelist", cmCreateTestSourceList);state->AddBuiltinCommand("define_property", cmDefinePropertyCommand);state->AddBuiltinCommand("enable_language", cmEnableLanguageCommand);state->AddBuiltinCommand("enable_testing", cmEnableTestingCommand);state->AddBuiltinCommand("get_source_file_property",cmGetSourceFilePropertyCommand);state->AddBuiltinCommand("get_target_property", cmGetTargetPropertyCommand);state->AddBuiltinCommand("get_test_property", cmGetTestPropertyCommand);state->AddBuiltinCommand("include_directories", cmIncludeDirectoryCommand);state->AddBuiltinCommand("include_regular_expression",cmIncludeRegularExpressionCommand);state->AddBuiltinCommand("install", cmInstallCommand);state->AddBuiltinCommand("install_files", cmInstallFilesCommand);state->AddBuiltinCommand("install_targets", cmInstallTargetsCommand);state->AddBuiltinCommand("link_directories", cmLinkDirectoriesCommand);state->AddBuiltinCommand("project", cmProjectCommand);state->AddBuiltinCommand("set_source_files_properties",cmSetSourceFilesPropertiesCommand);state->AddBuiltinCommand("set_target_properties",cmSetTargetPropertiesCommand);state->AddBuiltinCommand("set_tests_properties",cmSetTestsPropertiesCommand);state->AddBuiltinCommand("subdirs", cmSubdirCommand);state->AddBuiltinCommand("target_compile_definitions",cmTargetCompileDefinitionsCommand);state->AddBuiltinCommand("target_compile_features",cmTargetCompileFeaturesCommand);state->AddBuiltinCommand("target_compile_options",cmTargetCompileOptionsCommand);state->AddBuiltinCommand("target_include_directories",cmTargetIncludeDirectoriesCommand);state->AddBuiltinCommand("target_link_libraries",cmTargetLinkLibrariesCommand);state->AddBuiltinCommand("target_link_options", cmTargetLinkOptionsCommand);state->AddBuiltinCommand("target_sources", cmTargetSourcesCommand);state->AddBuiltinCommand("try_compile", cmTryCompileCommand);state->AddBuiltinCommand("try_run", cmTryRunCommand);state->AddBuiltinCommand("target_precompile_headers",cmTargetPrecompileHeadersCommand);#if !defined(CMAKE_BOOTSTRAP)state->AddBuiltinCommand("add_compile_options", cmAddCompileOptionsCommand);state->AddBuiltinCommand("aux_source_directory",cmAuxSourceDirectoryCommand);state->AddBuiltinCommand("export", cmExportCommand);state->AddBuiltinCommand("fltk_wrap_ui", cmFLTKWrapUICommand);state->AddBuiltinCommand("include_external_msproject",cmIncludeExternalMSProjectCommand);state->AddBuiltinCommand("install_programs", cmInstallProgramsCommand);state->AddBuiltinCommand("add_link_options", cmAddLinkOptionsCommand);state->AddBuiltinCommand("link_libraries", cmLinkLibrariesCommand);state->AddBuiltinCommand("target_link_directories",cmTargetLinkDirectoriesCommand);state->AddBuiltinCommand("qt_wrap_cpp", cmQTWrapCPPCommand);state->AddBuiltinCommand("qt_wrap_ui", cmQTWrapUICommand);state->AddBuiltinCommand("remove_definitions", cmRemoveDefinitionsCommand);state->AddBuiltinCommand("source_group", cmSourceGroupCommand);state->AddBuiltinCommand("cmake_file_api", cmFileAPICommand);state->AddDisallowedCommand("export_library_dependencies", cmExportLibraryDependenciesCommand,cmPolicies::CMP0033,"The export_library_dependencies command should not be called; ""see CMP0033.");state->AddDisallowedCommand("load_command", cmLoadCommandCommand, cmPolicies::CMP0031,"The load_command command should not be called; see CMP0031.");state->AddDisallowedCommand("output_required_files", cmOutputRequiredFilesCommand, cmPolicies::CMP0032,"The output_required_files command should not be called; see CMP0032.");state->AddDisallowedCommand("subdir_depends", cmSubdirDependsCommand, cmPolicies::CMP0029,"The subdir_depends command should not be called; see CMP0029.");state->AddDisallowedCommand("utility_source", cmUtilitySourceCommand, cmPolicies::CMP0034,"The utility_source command should not be called; see CMP0034.");state->AddDisallowedCommand("variable_requires", cmVariableRequiresCommand, cmPolicies::CMP0035,"The variable_requires command should not be called; see CMP0035.");
#endif
}void GetProjectCommandsInScriptMode(cmState* state)
{
#define CM_UNEXPECTED_PROJECT_COMMAND(NAME) \state->AddUnexpectedCommand(NAME, "command is not scriptable")CM_UNEXPECTED_PROJECT_COMMAND("add_compile_options");CM_UNEXPECTED_PROJECT_COMMAND("add_custom_command");CM_UNEXPECTED_PROJECT_COMMAND("add_custom_target");CM_UNEXPECTED_PROJECT_COMMAND("add_definitions");CM_UNEXPECTED_PROJECT_COMMAND("add_dependencies");CM_UNEXPECTED_PROJECT_COMMAND("add_executable");CM_UNEXPECTED_PROJECT_COMMAND("add_library");CM_UNEXPECTED_PROJECT_COMMAND("add_subdirectory");CM_UNEXPECTED_PROJECT_COMMAND("add_test");CM_UNEXPECTED_PROJECT_COMMAND("aux_source_directory");CM_UNEXPECTED_PROJECT_COMMAND("build_command");CM_UNEXPECTED_PROJECT_COMMAND("cmake_file_api");CM_UNEXPECTED_PROJECT_COMMAND("create_test_sourcelist");CM_UNEXPECTED_PROJECT_COMMAND("define_property");CM_UNEXPECTED_PROJECT_COMMAND("enable_language");CM_UNEXPECTED_PROJECT_COMMAND("enable_testing");CM_UNEXPECTED_PROJECT_COMMAND("export");CM_UNEXPECTED_PROJECT_COMMAND("fltk_wrap_ui");CM_UNEXPECTED_PROJECT_COMMAND("get_source_file_property");CM_UNEXPECTED_PROJECT_COMMAND("get_target_property");CM_UNEXPECTED_PROJECT_COMMAND("get_test_property");CM_UNEXPECTED_PROJECT_COMMAND("include_directories");CM_UNEXPECTED_PROJECT_COMMAND("include_external_msproject");CM_UNEXPECTED_PROJECT_COMMAND("include_regular_expression");CM_UNEXPECTED_PROJECT_COMMAND("install");CM_UNEXPECTED_PROJECT_COMMAND("link_directories");CM_UNEXPECTED_PROJECT_COMMAND("link_libraries");CM_UNEXPECTED_PROJECT_COMMAND("project");CM_UNEXPECTED_PROJECT_COMMAND("qt_wrap_cpp");CM_UNEXPECTED_PROJECT_COMMAND("qt_wrap_ui");CM_UNEXPECTED_PROJECT_COMMAND("remove_definitions");CM_UNEXPECTED_PROJECT_COMMAND("set_source_files_properties");CM_UNEXPECTED_PROJECT_COMMAND("set_target_properties");CM_UNEXPECTED_PROJECT_COMMAND("set_tests_properties");CM_UNEXPECTED_PROJECT_COMMAND("source_group");CM_UNEXPECTED_PROJECT_COMMAND("target_compile_definitions");CM_UNEXPECTED_PROJECT_COMMAND("target_compile_features");CM_UNEXPECTED_PROJECT_COMMAND("target_compile_options");CM_UNEXPECTED_PROJECT_COMMAND("target_include_directories");CM_UNEXPECTED_PROJECT_COMMAND("target_link_libraries");CM_UNEXPECTED_PROJECT_COMMAND("target_sources");CM_UNEXPECTED_PROJECT_COMMAND("try_compile");CM_UNEXPECTED_PROJECT_COMMAND("try_run");// deprecated commandsCM_UNEXPECTED_PROJECT_COMMAND("export_library_dependencies");CM_UNEXPECTED_PROJECT_COMMAND("load_command");CM_UNEXPECTED_PROJECT_COMMAND("output_required_files");CM_UNEXPECTED_PROJECT_COMMAND("subdir_depends");CM_UNEXPECTED_PROJECT_COMMAND("utility_source");CM_UNEXPECTED_PROJECT_COMMAND("variable_requires");#undef CM_UNEXPECTED_PROJECT_COMMAND
}
相关文章:
cmake 之 CMakeLists.txt 中的函数是从哪里来的
我们都知道,cmake会解释执行 CMakeLists.txt 以及其他 *.cmake 脚本, 这里先给出一个“先验” 的知识点: 任何一个独立脚本或脚本函数命令的执行,都是通过 CPP 函数 RunListFile(...) 调用的 void cmMakefile::RunListFile(cmL…...
谷歌or-tools开源库入门
1.命令行编译程序 这里要说明下,直接用qt或者VS2022打开cmake工程,编译没有成功。所以,老老实实的按照官方教程来,使用命令行编译。 (1)准备 1)安装cmake,版本3.18以上࿰…...
深入解析 C++ Vector:全面掌握 STL 核心容器的原理与高效实践
一、Vector 的核心概念与特性 Vector 是 C 标准库中最常用的动态数组容器,其底层基于连续内存存储元素,兼具数组的高效访问与动态扩容的灵活性。以下是其核心特性: 1.1 核心特性对比 特性普通数组Vector 容器内存分配静态固定动态增长访问效…...
【MySQL】MySQL数据存储机制之存储引擎
目录 1.如何理解存储引擎? 2.MySQL 提供的存储引擎 3.存储引擎的功能特性 (1)存储介质 (2)事务处理能力 (3)锁定 (4)备份和恢复 (5)优化…...
OpenCV旋转估计(1)用于估计图像间仿射变换关系的类cv::detail::AffineBasedEstimator
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 基于仿射变换的估计器。 这种估计器使用匹配器估算的成对变换来为每个相机估算最终的变换。 cv::detail::AffineBasedEstimator 是 OpenCV 库中…...
小红书不绑定手机号会显示ip吗
小红书作为一个生活方式分享平台,拥有庞大的用户群体。在小红书上,用户可以分享自己的生活点滴、购物心得、美食体验等,与其他用户进行互动交流。最近,不少用户对于小红书是否会在不绑定手机号的情况下显示IP属地产生了疑问&#…...
网络空间安全(36)数据库权限提升获取webshell思路总结
一、获取数据库访问权限 寻找漏洞: SQL注入:这是最常见的方法之一。攻击者通过SQL注入漏洞,可以在数据库执行任意SQL语句,从而获取数据库中的数据,甚至可能获取数据库的访问权限。配置文件泄露:有时&#x…...
OceanBase 中,如何抓包分析应用连接超时的问题
本文作者:胡呈清,爱可生 DBA 团队成员,擅长故障分析、性能优化 与MySQL这类单机数据库相比,OceanBase分布式数据库的访问链路相对较长,因此在遇到连接异常时,排查过程需要额外考虑更多环节。接下来…...
用uv管理python环境/项目(各种应用场景)
一、安装uv 有python的情况 pip install uvWindows powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"linux或macOS curl -LsSf https://astral.sh/uv/install.sh | sh二、换镜像源 uv不会读取pip的镜像源配置,所…...
Linux——进程(5)进程地址空间
先看一个程序和现象 预期现象是,子进程和父进程相互独立,子进程的gval是100,101,102....而父进程一直都是100. 结果我们并不意外,只是我们发现,父子进程的gval的地址是一样的,这有点颠覆我们的认…...
docker(1) -- centos镜像
1. 前言 我在WSL中运行的系统是ubuntu2024,并安装了docker,想要在docker中运行一个centos的系统。 2. 下载并运行镜像 # 下载centos最新版镜像 $ docker pull centos Using default tag: latest latest: Pulling from library/centos a1d0c7532777: P…...
Vitis 2024.1 无法正常编译custom ip的bug(因为Makefile里的wildcard)
现象:如果在vivado中,添加了自己的custom IP,比如AXI4 IP,那么在Vitis(2024.1)编译导出的原本的.xsa的时候,会构建build失败。报错代码是: "Compiling blank_test_ip..."…...
【源码阅读】多个函数抽象为类(实现各种类型文件转为PDF)
目录 一、原始函数二、类三、转换过程 一、原始函数 最开始就是写了几个函数(包括doc、excel、ppt类型的文件)转换为pdf,需要将这些函数形成一个类。相似的一类函数就可以组成一个实现特定功能的类 import subprocess import pandas as pd i…...
word插入Mathtype公式居中和自动更新
word插入公式自动更新 前提:安装Mathtype 1.word中查看页的宽度 出现如下 2.设置样式 出现这个窗口 给样式随便起个名字 3.修改样式 3.1 设置两个制表位 第二个 3.2 修改公式字体 如下所示 4. 修改公式格式 4.1在word中打开 Mathtype 4.2 修改公式的格式 变成…...
SpringSecurity配置(自定义认证过滤器)
文末有本篇文章的项目源码文件可供下载学习 在这个案例中,我们已经实现了自定义登录URI的操作,登录成功之后,我们再次访问后端中的API的时候要在请求头中携带token,此时的token是jwt字符串,我们需要将该jwt字符串进行解析,查看解析后的User对象是否处于登录状态.登录状态下,将…...
python字符级差异分析并生成 Word 报告 自然语言处理断句
import difflib from docx import Document from docx.shared import RGBColor from snownlp import SnowNLPdef analyze_char_differences(text_a, text_b):"""分析两个文本的字符级差异:param text_a: 第一个文本:param text_b: 第二个文本"""…...
企业级云MES全套源码,支持app、小程序、H5、台后管理端
企业级云MES全套源码,支持app、小程序、H5、台后管理端,全套源码 开发环境 技术架构:springboot vue-element-plus-admin 开发语言:Java 开发工具:idea 前端框架:vue.js 后端框架ÿ…...
使用GoldenGate完成SQLserver到Oracle的数据实时同步
一、环境准备 *项目**源环境**目标环境*操作系统CentOS Linux release 7.6CentOS Linux release 7.6IP地址192.168.3.92192.168.3.168数据库及版本SQLserver 2016Oracle 11.2.0.4.0GoldenGate用户oggoggGoldenGate版本12.3.0.2.012.3.0.2.0 二、OGG架构 GoldenGate v11 能够…...
【OpenCV C++】如何快速 高效的计算出图像中大于值的像素个数? 遍历比较吗? No,效率太低!那么如何更高效?
文章目录 1 问题2 分析3 代码实现 (两种方法实现)方法1: 使用cv::compare方法2: 使用cv::threshold3.2 compare和threshold 看起来都有二值化效果? 那么二者效率?4 compare函数解释4.1 参数解释4.2 底层行为规则4.3 应用示例4.4 典型应用场景1 问题 一幅图像的目标区域ROI…...
Golang | 每日一练 (6)
💢欢迎来到张胤尘的技术站 💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 Golang | 每日一练 (6)题目参考答案什么是内存逃逸&am…...
git clone, 算是解决可以访问github但无法clone的问题
本文的前提是使用了**且可以正常访问github 查看代理的端口 将其配置到git 首先查看git配置 git config --list然后添加配置,我这边使用的是Hiddfy默认的端口是12334,如果是clash应该是7890 git config --global http.proxy 127.0.0.1:12334其他 删除…...
SpringBoot项目controller层接收对应格式请求的相关RequestMapping配置
目录 (1) (2) (3) 注:此情况注意和(4)中情况进行区分 (4) 在几个springboot项目开发后,我总结了以下的一些常见的接收对应请求的…...
基于ssm学科竞赛小程序的设计及实现(源码+lw+部署文档+讲解),源码可白嫖!
摘要 随着信息时代的来临,过去的学科竞赛管理方式的缺点逐渐暴露,本次对过去的学科竞赛管理方式的缺点进行分析,采取计算机方式构建学科竞赛小程序。本文通过阅读相关文献,研究国内外相关技术,提出了一种关于竞赛信息…...
【论文笔记】VGGT-从2D感知3D:pose估计+稠密重建+点跟踪
VGG组联合Meta改进了dust3r,输入图片,输出对应的一系列3D属性,被CVPR2025收录! 1.abstract 我们提出了VGGT,一种前馈神经网络,能够直接从场景的一个、几个或数百个视角推断出所有关键的3D属性,…...
【大模型系列篇】硅基智能开源数字人模型HeyGem.ai,开启数字人时刻
硅基智能开源数字人模型HeyGem.ai, 1秒克隆生成4K视频, 支持离线多语言, 开源72小时狂揽1.3k星, 目前已经获得3.4k星。 硅基智能正式宣布在GitHub开源全球TOP级数字人模型,同时发布基于该模型的同名数字人工具硅基数字人克隆的本地安装包,这一举措标志着…...
腾讯云容器集群:节点可以访问公网,节点内的pod无法访问公网
腾讯云容器集群:节点可以访问公网,节点内的pod无法访问公网 curl https://www.baidu.com/index.htm参考链接:https://cloud.tencent.com/document/product/457/50356 sysctl -a|grep net.ipv4.conf.all.rp_filter sysctl -a|grep net.ipv4.c…...
Winform优化控件布局性能 SuspendLayout 和 ResumeLayout 方法详解
在Winform中,SuspendLayout 和 ResumeLayout 方法用于优化控件布局性能,适用于批量修改控件属性或动态调整控件时的场景。以下是具体使用方法和注意事项: 一、基本用法 1.调用 SuspendLayout() 在开始批量修改控件前,调用…...
基于Netty实现高性能HTTP服务的架构解析
一、HTTP协议基础 1.1 HTTP协议概述 HTTP(HyperText Transfer Protocol)作为现代Web应用的基石,是基于TCP/IP的应用层协议,具有以下核心特性: 请求/响应模型:客户端发起请求,服务端返回响应无…...
Sqlite下载、安装与数据库创建
Sqlite官网 https://www.sqlite.org/index.html 官方文档链接 https://www.sqlite.org/docs.html 官方文档是英文版的,如果想看中文的文档请参考 **菜鸟教程** 网站中的 **《Sqlite教程》:https://www.runoob.com/sqlite/sqlite-tutorial.html 官方下载…...
内网环境安装dlv,本地远程调试go
背景:内网环境(服务器)下安装dlv,本地通过dlv调试编译后的go代码。 可以配合观看: 【dlv远程调试-哔哩哔哩】 https://b23.tv/NqPZ5q9 内网安装dlv步骤 1、dlv安装: (我额服务器和内网的go都是1.21以上) # 先在有网络的环境下(…...
【使用 Element UI 实现手动上传文件:FormData 追加文件和其他参数,支持单文件覆盖上传】
在开发 Web 应用时,文件上传是一个常见的需求。Element UI 提供了强大的 el-upload 组件,可以轻松实现文件上传功能。本文将详细介绍如何使用 Element UI 实现以下功能: 手动触发文件上传:用户选择文件后,点击按钮手动…...
python基础8 单元测试
通过前面的7个章节,作者学习了python的各项基础知识,也学习了python的编译和执行。但在实际环境上,我们需要验证我们的代码功能符合我们的设计预期,所以需要结合python的单元测试类,编写单元测试代码。 Python有一个内…...
第四节:sqlx库使用指南
在项目中我们通常可能会使用database/sql连接MySQL数据库。本文借助使用sqlx实现批量插入数据的例子,介绍了sqlx中可能被你忽视了的sqlx.In和DB.NamedExec方法。 sqlx介绍 在项目中我们通常可能会使用database/sql连接MySQL数据库。sqlx可以认为是Go语言内置datab…...
麒麟操作系统作为服务器,并且需要在浏览器上调试 MATLAB
在内网环境下,使用麒麟操作系统作为服务器,并且需要在浏览器上调试 MATLAB 程序,这确实复杂,但仍然有可行的解决方案。麒麟操作系统是国产化的 Linux 发行版(如基于 Ubuntu Kylin 或银河麒麟),因…...
在线教育网站项目第四步:deepseek骗我, WSL2不能创建两个独立的Ubuntu,但我们能实现实例互访及外部访问
一、说明 上一章折腾了半天,搞出不少问题,今天我们在deepseek的帮助下,完成多个独立ubuntu24.04实例的安装,并完成固定ip,实践证明,deepseek不靠谱,浪费我2个小时时间,我们将在下面实…...
AI安全、大模型安全研究(DeepSeek)
DeepSeek 点燃AI应用革命之火,但安全 “灰犀牛” 正在逼近 DeepSeek-R1国产大模型的发布,以技术创新惊艳了全球,更是极致的性价比推动国内千行百业接入 AI,政府、企业竞速开发智能业务处理、智能客服、代码生成、营销文案等应用,“落地效率” 成为第一关键词。然而与此相…...
(hash表+vector 数位和相等数对的最大和)leetcode 2342
一定要断点调试看看数据对不对的上!!!不然很容易弄不清楚值和下标 这个题意思是在nums中找出相同数位和的值 如 数位和为7 nums中符合要求的有 43,7 在这些数中选两个相加取最大值,再与其他数位和取得的相加最大值比…...
正则表达式引擎深入探讨
正则表达式引擎(Regular Expression Engine)是正则表达式得以“活起来”的核心。它是一个精密的软件组件,负责接收正则表达式和输入文本,解析模式并执行匹配或替换操作,最终输出结果——可能是简单的“是否匹配”&…...
[蓝桥杯 2023 省 B] 飞机降落(不会dfs的看过来)
[蓝桥杯 2023 省 B] 飞机降落 题目描述 N N N 架飞机准备降落到某个只有一条跑道的机场。其中第 i i i 架飞机在 T i T_{i} Ti 时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 D i D_{i} Di 个单位时间,即它最早可以于 T i T_{i} Ti 时刻…...
DockerTLS加密/不加密传输
前言: 在Docker容器的网络通信中,安全性是至关重要的。DockerTLS作为一种加密传输协议,通过为Docker守护进程与客户端之间的通信提供加密层,有效防止数据在传输过程中被窃取或篡改。然而,在某些特定场景下,…...
基于微信小程序的充电桩管理系统
一、开发背景 在开发充电汽车管理系统之前,深入的需求分析至关重要。我们要充分了解不同用户群体的需求,比如私家车主希望充电过程便捷、高效、安全,能够实时查看充电状态和费用明细;出租车、网约车司机则更注重充电速度和充电桩…...
Excel导出工具类--复杂的excel功能导出(使用自定义注解导出)
Excel导出工具类 前言: 简单的excel导出,可以用easy-excel, fast-excel, auto-poi,在导出实体类上加上对应的注解,用封装好的工具类直接导出,但对于复杂的场景, 封装的工具类解决不了,要用原生的excel导出(easy-excel, fast-excel, auto-poi都支持原生的) 业务场景: 根据…...
创新实训项目初始化——gitee的使用
创新实训项目管理采用gitee,写下这篇博客熟悉gitee进行项目创建和版本同步 一、gitee概述 Gitee 是一个基于 Git 的代码托管平台,与 GitHub 类似,Gitee 提供了丰富的功能,比如代码仓库的创建、分支管理、代码审查等。 二、gite…...
【原创】使用ElasticSearch存储向量实现大模型RAG
一、概述 检索增强生成(Retrieval-Augmented Generation,RAG)已成为大型语言模型(LLM)应用的重要架构,通过结合外部知识库来增强模型的回答能力,特别是在处理专业领域知识、最新信息或企业私有数…...
Gymnasium Cart Pole 环境与 REINFORCE 算法 —— 强化学习入门 2
Title: Gymnasium Cart Pole 环境与 REINFORCE 算法 —— 强化学习入门 2 文章目录 I. Gymnasium Cart Pole 环境II. REINFORCE 算法1. 原理说明2. REINFORCE 算法实现 I. Gymnasium Cart Pole 环境 Gymnasium Cart Pole 环境是一个倒立摆的动力学仿真环境. 状态空间: 0: Ca…...
响应式数据 和 Pinia 状态
响应式数据 和 Pinia 状态 是 Vue.js 应用中用于管理数据的两种重要机制,它们之间有密切的关系。以下是它们的定义、特点以及关系: 1. 响应式数据 定义 响应式数据 是 Vue.js 的核心特性之一,指的是当数据发生变化时,视图会自动…...
在大数据开发中hive是指什么?
hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在大数据技术的浩瀚星空中,Apache Hive犹如一座桥梁,连接着传统数据仓库理念…...
LeRobot源码剖析——对机器人各个动作策略的统一封装:包含ALOHA ACT、Diffusion Policy、VLA模型π0
前言 过去2年多的深入超过此前7年,全靠夜以继日的勤奋,一天当两天用,抠论文 抠代码 和大模型及具身同事讨论,是目前日常 而具身库里,idp3、π0、lerobot值得反复研究,故,近期我一直在抠π0及l…...
Python生成requirements.txt的两种方法
Python生成requirements.txt的两种方法 方法一:导出当前环境的依赖包 使用pipreqs --encodingutf8为使用utf8编码,避免编码报错 --force 强制执行覆盖生成目录下的requirements.txt # 安装 python3 -m pip install pipreqs # 在当前目录生成 pipreqs . …...
如何判断 MSF 的 Payload 是 Staged 还是 Stageless(含 Meterpreter 与普通 Shell 对比)
在渗透测试领域,Metasploit Framework(MSF)的 msfvenom 工具是生成 Payload(载荷)的核心利器。然而,当我们选择 Payload 时,经常会遇到一个问题:这个 Payload 是 Staged(…...