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

VS运行时库配置区别(静态链接和动态链接区别)

VS中 配置项 MTD_StaticDebug和MTD_DynamicDebug有什么区别已阅读 10 个网页MTd_StaticDebug和MDd_DynamicDebug是 Visual Studio 中控制C/C 运行时库CRTC Runtime Library链接方式的两种不同配置选项。简单来说这两者的核心区别在于如何将 C 标准库的代码整合到你的程序中MTd_StaticDebug(静态链接)直接将运行时库的代码复制并嵌入到你的最终程序 (.exe 或 .dll) 中。MDd_DynamicDebug(动态链接)你的程序本身不包含运行时库的代码而是在运行时去调用系统目录下独立的.dll文件如MSVCRTxxD.dll。两者名称中的d(Debug) 都表示这是调试版本包含了额外的调试信息和检查机制因此体积更大但便于开发时排查错误。为了更清晰地展示它们的区别可以参考下表对比维度MTd_StaticDebug(静态)MDd_DynamicDebug(动态)对应编译开关/MTd/MDd链接的库文件LIBCMTD.libMSVCRTD.lib运行时依赖无需额外依赖自包含需要目标机器存在特定版本的MSVCRTxxD.dll最终文件体积较大CRT 代码被静态打包进去较小CRT 代码在共享的 DLL 中内存管理/堆每个模块如多个静态库有自己独立的堆跨模块释放内存易出问题所有模块共享同一个堆内存管理更安全适合复杂项目典型用途建议简单的、不想依赖外部环境的独立小工具多模块的大型项目、DLL动态链接库项目等⚠️ 关键规则必须保持全局统一在使用 Visual Studio 进行项目配置时有一条绝对不能违反的铁律一个进程或最终的二进制文件中所有编译单元包括你写的代码、引用的第三方静态库等必须使用完全相同的运行时库设置。如果违反了此规则最直观的表现就是在编译链接时遇到LNK2038错误提示类似value MTd_StaticDebug doesnt match value MDd_DynamicDebug。错误示例与排查思路当你尝试将一个使用/MTd编译的静态库链接到一个使用/MDd编译的主程序时就会触发这类错误。错误场景一项目设置与依赖库不匹配假设你的主程序设置为/MDd (DynamicDebug)但链接到了一个使用/MTd (StaticDebug)编译的third_party.lib链接器就会报错。错误场景二第三方库自身不统一这也是常见情况比如你使用的某个 SDK如 CEF、gRPC 等或者通过 vcpkg、CMake 构建的库如 Google Test、Protobuf、OpenCV 等其默认编译方式可能与你的主项目不同。解决方法你需要确保整个解决方案中的所有项目.exe 和它依赖的所有 .lib的配置完全一致。要么全部改为/MTd要么全部改为/MDd。 总结与建议检查当前配置在 VS 中右键项目 →属性→配置属性→C/C→代码生成→运行库即可查看或修改此选项。如何选择对于大型项目或生成 DLL的项目默认的/MDd是更标准、更安全的选择。如果你需要生成一个独立的、不依赖任何 VC 运行库的.exe文件可以考虑使用/MTd。遇到 LNK2038 错误时这意味着统一性被破坏。你需要找到项目中配置不一致的模块将其统一修改。如果你在编译某个开源库时遇到此错误通常可以在其 CMake 配置中找到类似gtest_force_shared_crt或protobuf_MSVC_STATIC_RUNTIME的选项来匹配你的主项目配置。那我一个程序中exe用动态链接下面的dll用静态链接应该没问题吧我也没办法保证我依赖的所有第三方dll都用统一的链接方式。这是一个非常典型且容易让人困惑的问题。我来直接给出结论然后详细解释原因。简短结论这是严重问题会导致难以调试的内存崩溃你的设想EXE 用/MDd(动态)DLL 用/MTd(静态)是不安全的绝对不能这样做。核心问题堆(Heap)的不匹配发生了什么EXE (使用/MDd)程序启动时动态加载MSVCRTxxD.dll这个 DLL 会创建并管理一个全局堆。EXE 中所有的new、malloc都会从这个堆分配内存。DLL (使用/MTd)编译时静态链接版本的 CRT 代码被直接嵌入到你的 DLL 文件中。这个静态版本的 CRT 会创建自己独立的堆完全独立于 EXE 的堆。灾难现场cpp// 在 DLL 内部使用了 /MTd void* ptr malloc(100); // 从 DLL 的私有堆分配 // 在 EXE 内部使用了 /MDd delete ptr; // EXE 试图将 ptr 释放到 EXE 的堆中 // 崩溃或者产生内存损坏为什么会这样能否规避你可能会想我不在 EXE 中释放 DLL 分配的内存不就行了危险的现实即使你小心翼翼地避免跨模块释放内存问题依然存在C 对象的隐式操作cpp// DLL 中/MTd class MyClass { std::vectorint data; // vector 内部会分配/释放内存 }; MyClass* create() { return new MyClass(); } // EXE 中/MDd MyClass* obj create(); delete obj; // 崩溃析构函数释放 vector 的内存时出错异常跨模块传递如果 DLL 抛出异常EXE 去捕获它需要跨越不同 CRT 版本的异常处理机制这几乎必然崩溃。标准库对象的跨模块使用cpp// DLL 返回一个 std::string/MTd std::string getString(); // EXE 使用这个 string/MDd std::string s getString(); // 拷贝构造时可能崩溃正确做法必须统一方案一全部使用动态链接/MDd✅强烈推荐textEXE (/MDd) ← DLL1 (/MDd) ← DLL2 (/MDd) ← 第三方DLL (官方提供的通常是/MD)这是 Windows 世界的标准实践原因所有模块共享同一个堆只有一个 CRT 副本在内存中节省空间第三方库Qt、OpenCV、FFmpeg 等官方提供的预编译版本几乎都是/MD方案二全部使用静态链接/MTd✅ 可行但有限制textEXE (/MTd) DLL1 (/MTd) DLL2 (/MTd) 一个巨大的 EXE问题如果静态链接到多个 DLL每个 DLL 都有独立的 CRT 副本仍有堆问题但至少可以控制如果所有模块都用/MTd且你不跨模块传递内存/对象只传递原始数据如char*、int、struct可以勉强工作实际工作中的解决方案场景1你的项目 几个第三方DLL最佳实践全部使用/MDdDebug//MDRelease如果某个第三方库只提供了静态库.lib可以检查该库的配置看能否重新编译为/MDd或者联系供应商获取动态链接版本场景2你无法控制某些DLL的编译方式核心原则不要让这些不一致的模块互相传递C对象cpp// 错误做法跨模块传递对象 DLL_MTD_API std::vectorint getData(); // 危险 // 正确做法使用纯C接口 DLL_MTD_API void getData(int** data, int* size); // 安全 DLL_MTD_API void freeData(int* data); // 让分配者也负责释放场景3被迫混合使用时的救急方案如果你实在无法统一必须混合使用纯C接口隔离cpp// DLL 只导出 C 函数 extern C { __declspec(dllexport) void* create_buffer(int size); __declspec(dllexport) void destroy_buffer(void* buf); }分配和释放必须在同一模块内永远不要跨模块传递 C 对象std::string、vector、自定义类等不要跨模块抛出异常调试 LNK2038 错误的实用技巧当你遇到链接错误时查找哪个库配置不一致bash# 使用 dumpbin 检查 .lib 文件 dumpbin /directives your_library.lib | findstr DEFAULTLIB常见第三方库的配置选项Google Testgtest_force_shared_crtCMake 选项Protobufprotobuf_MSVC_STATIC_RUNTIMECMake 选项OpenCVBUILD_WITH_STATIC_CRTCMake 选项vcpkg安装时选择triplet如x64-windows动态vsx64-windows-static静态总结配置EXEDLL是否安全✅/MDd/MDd安全标准做法✅/MTd/MTd安全但不跨模块传递对象❌/MDd/MTd危险内存崩溃❌/MTd/MDd危险内存崩溃最终建议坚持使用/MDdDebug和/MDRelease。这是 Windows 上 99% 项目的标准也是你遇到的所有第三方库期望的配置。如果必须静态链接确保整个解决方案全部统一为/MTd。那如果exe依赖的两个dll一个是vs2019编译的一个是vs2017编译的这样两个依赖的运行时库也不一样这样不会有问题吗已阅读 6 个网页这是一个很好的追问也是实际开发中经常遇到的场景。直接回答你的问题在大多数情况下这样做并不会有问题但前提是你必须满足一个关键条件。✅ 核心结论VS 2019 和 VS 2017 是二进制兼容的从 Visual Studio 2015 Update 3 开始一直到 VS 2017、VS 2019、VS 2022 乃至未来的 VS 2026所有这些版本编译出来的 C 代码包括运行时库都是二进制兼容 (binary-compatible)的。这意味着用 VS 2017 编译的 DLL可以被 VS 2019 编译的 EXE 安全地调用反之亦然。微软这么做的目的是让开发者可以升级工具链而不用被迫重新编译所有依赖的第三方库。它们兼容的根本原因是虽然这些 Visual Studio 的版本号看起来变化很大但它们底层使用的主要工具集版本号都是 14VS 2015 是 v140VS 2017 是 v141VS 2019 是 v142VS 2022 是 v143。微软保证了这个主版本号内的所有版本是兼容的。⚠️ 必须满足的关键条件使用动态链接 (/MD)这个“二进制兼容”能成立有一个非常重要的前提你提到的这个情况和之前讨论的“/MDd vs /MTd”是同一个前提即所有模块都必须动态链接到运行时库使用/MD或/MDd。在这个前提下你的 EXE 和两个 DLL一个 VS 2017 编译一个 VS 2019 编译都会链接到同一个动态链接库文件比如vcruntime140.dll或vcruntime140d.dllDebug 版本。当程序运行时最终被加载到进程中的只有一份vcruntime140.dll。既然大家用的都是同一份运行时库代码自然就在同一个“堆”上工作也可以安全地跨模块传递std::string、vector等 C 对象而不会出现内存问题。分发程序时只需要确保目标机器安装了最新版的Microsoft Visual C Redistributable即可。 两个重要的例外情况需要警惕当然除了上述主要规则外在两种特殊情况下依然可能出问题需要你留心检查使用了“全程序优化 (/GL)”或“链接时代码生成 (/LTCG)”如果你的某个 DLL 项目开启了/GL编译选项并使用/LTCG进行链接那么这个 DLL 的二进制文件就与不同版本的工具集不兼容了。示例一个用 VS 2019 v16.7 工具集、开启了/GL选项编译的静态库无法在 VS 2019 v16.8 工具集上链接。解决方法检查所有相关项目的“C/C - 优化”和“链接器 - 优化”设置。如果开启了这些选项你需要确保整个程序的所有模块EXE 和 DLL都是用完全相同的编译器版本甚至包括具体的 Update 版本构建的。跨过“2015”这个边界上述“二进制兼容”的承诺是从 VS 2015 Update 3 开始的。如果你依赖的第三方 DLL 是使用VS 2013 或更早版本的工具集编译的那么它与你 VS 2019/2017 编译的 EXE不兼容。解决方案必须获取该 DLL 的源代码并用 VS 2017 或 2019 重新编译它或者放弃使用它。 总结你描述的情况“EXE 用 VS 2019DLL 用 VS 2017”是安全且被官方支持的前提是两者都使用动态链接运行时库 (/MD或/MDd)没有使用/GL和/LTCG选项进行全程序优化它们不是 VS 2013 或更早版本编译的微软设计这套兼容性就是为了让你这种情况能正常工作避免“DLL Hell”。VS2015 以后所有的C运行时库名字都是vcruntime140d.dll吗已阅读 3 个网页不是的这是一个常见的误区。实际上Visual Studio 2015 及之后版本的 C 运行时库不是一个单一的 DLL而是被拆分成了两个核心部分vcruntime140.dll和ucrtbase.dll。1. 为什么不是只有一个 DLL在 Visual Studio 2015 中微软对 C 运行时库进行了一次重大重构。旧版本VS2013及之前中那个庞大的msvcr120.dll被拆分成了两部分vcruntime140.dll包含 C 特定的东西如程序启动和异常处理。ucrtbase.dll包含标准的 C 库函数如printf、malloc等现在是 Windows 系统组件。2. 版本号 “140” 的含义文件名中的140代表的是工具集版本号 (Toolset Version)而不是 Visual Studio 的发布年份。Visual Studio 版本工具集版本对应的 DLL 名称VS 2015v14.0vcruntime140.dllVS 2017v14.1vcruntime140.dllVS 2019v14.2vcruntime140.dllVS 2022v14.3vcruntime140.dll如表格所示从 VS 2015 到 VS 2022虽然年份变了但 DLL 的文件名都叫vcruntime140.dll。这就是为什么之前提到它们二进制兼容的原因——本质上它们都是基于 v14 这个主干迭代的。3. 关于 “vcruntime140d.dll” 的特殊性你问题中提到的vcruntime140d.dll确实是调试版本。文件名中的d代表 Debug。发布版 (Release)vcruntime140.dll(可再分发可通过 VC_redist.exe 安装)。调试版 (Debug)vcruntime140d.dll(不可再分发仅存在于开发机的 Visual Studio 安装目录下用于调试)。总结下次查看文件时可以这样区分VS2015/2017/2019/2022编译的程序依赖vcruntime140.dll。VS2013编译的程序依赖msvcr120.dll。文件名带d是调试版不要发给用户。如果我的exe和所有的dll都是静态链接c运行时库那我最终运行的进程会包含多个运行时库吗会包含多个全局堆吗这是一个非常好的问题直指静态链接的核心技术细节。直接给出结论是的你的进程会包含多份C运行时库的代码副本并且会拥有多个独立的全局堆。下面来详细解释这会导致什么后果。1. 会发生什么假设你有一个main.exe和两个DLLA.dll和B.dll并且全部都使用/MTd静态链接编译。代码层面最终生成的main.exe、A.dll、B.dll这三个二进制文件各自都独立包含了一份完整的C运行时库代码。比如malloc、free、new、delete、std::string的实现代码会被分别复制到这三个文件里。内存堆层面这是最关键的问题。程序启动时main.exe启动它内部的静态CRT代码会执行初始化在进程的默认堆之外创建一个私有的全局堆称为堆A。当LoadLibrary加载A.dll时该DLL内的静态CRT代码会再次执行初始化。因为它是一个独立的代码副本它不知道堆A的存在所以它也会创建另一个私有的全局堆称为堆B。同样地B.dll会创建第三个私有全局堆称为堆C。最终你的一个进程里有三个功能完全一样、但互相隔离的堆。2. 这会导致什么问题最直接的后果跨模块内存释放导致崩溃这是静态链接最致命的问题。cpp// 在 A.dll 的代码中 (静态链接 /MT) int* getData() { int* p new int[100]; // 内存从 堆B (A.dll的堆) 分配 return p; } // 在 main.exe 的代码中 (静态链接 /MT) void test() { int* data getData(); // 拿到指针 delete[] data; // 释放内存 - main.exe 试图将指针释放到 堆A // 崩溃因为释放内存的堆 (堆A) 不是分配内存的堆 (堆B) }复杂的后果资源泄漏与标准库对象失效资源泄漏即便你的代码从不跨模块delete只要使用了某些C特性就会出问题。cpp// A.dll 返回一个 std::string std::string getName() { std::string s hello; return s; // s 的内存在 堆B 上分配 } // main.exe 接收并销毁它 std::string name getName(); // 当 name 离开作用域时main.exe 调用 std::string 的析构函数 // 这个析构函数会尝试释放 堆B 上的内存但运行它的代码属于 main.exe (使用堆A) // 崩溃或内存损坏任何在A.dll中创建、在main.exe中销毁的std::string、std::vector等容器都会导致崩溃。符号冲突很难调试的bug如果main.exe和A.dll都定义了一个全局变量比如std::cout的某种内部状态它们会各自拥有独立的副本。这会导致一些依赖全局状态的行为产生不符合预期的结果。3. 什么情况下静态链接没问题虽然听起来很可怕但在受控条件下静态链接是可以工作的。工程实践中也有很多大型项目使用/MT。核心原则所有跨模块边界的接口必须是“纯C接口”或纯粹的Windows API并且遵循“谁分配谁释放”的规则。安全的做法示例cpp// A.dll 的公共头文件 (纯C接口) #ifdef __cplusplus extern C { #endif // 规则1: 只传递原始指针和基本类型 void* create_buffer(size_t size); // 规则2: 同一个模块负责释放自己创建的资源 void destroy_buffer(void* buffer); // 规则3: 让调用者提供缓冲区而不是返回新对象 void get_data(void* user_provided_buffer, size_t buffer_size); #ifdef __cplusplus } #endif实施原则DLL内部可以用满C特性尽情使用std::vector、std::string。但在DLL的边界导出的函数参数和返回值只能使用int、char*、void*、struct*这些C语言类型。DLL内部创建的资源如对象的指针必须由DLL自身提供销毁函数。总结配置方案运行时库副本数全局堆数量跨模块传递C对象推荐度全部动态链接(/MD)1份(系统DLL)1个(共享)✅ 安全⭐⭐⭐⭐⭐ (首选)全部静态链接(/MT)N份 (每个模块一份)N个 (隔离)❌ 崩溃⭐⭐ (除非必须)首选方案始终优先使用动态链接(/MD)。这符合Windows的设计理念避免了这些棘手的内存问题。静态链接(/MT)只应在以下严格条件下使用你完全控制所有模块的接口并能确保遵循“纯C接口”约定。你需要生成一个独立、无额外依赖的单一.exe文件不适用于包含DLL的场景。你需要解决DLL部署时的复杂依赖问题通常引入的内存管理问题比解决部署问题更麻烦。针对你最初设想的“EXE和所有DLL都用静态链接”方案如果项目只有EXE没有DLL是可以的。但如果项目由EXE和多个DLL组成那么这个方案会埋下巨大的隐患。除非你极其严格地遵守“纯C接口”原则否则几乎一定会遇到难以调试的随机崩溃。那如果我有几个静态库是静态链接c运行时库最后把几个静态库一起链接成exe的时候也是静态链接c运行时库此时exe里面会包含多个c运行时库吗这是一个非常精彩的追问它精准地触及了静态链接和静态库工作的核心原理。直接给出结论不会。最终生成的 EXE 里只有一份C 运行时库的代码。这是一个和“多个 DLL 各自包含一份”完全不同的情况也是静态链接工作方式的精髓所在。为什么“多个静态库”链接成 EXE 时不会有多份关键在于理解静态库 (.lib)和动态链接库 (.dll)的本质区别静态库 (.lib)它不是可执行代码而是一个代码的“压缩包”或“归档文件”。里面存放着编译好的、但还没有链接到最终程序里的.obj目标文件。链接过程当你把几个静态库链接成一个 EXE 时链接器的工作是解开这些压缩包把里面的.obj文件拿出来然后像玩拼图一样把这些.obj和你主程序的.obj合并成一个完整的、连贯的 EXE 文件。具体会发生什么假设你有LibA.lib和LibB.lib它们都是使用/MT(静态链接) 编译的。编译阶段编译LibA时它所需的 C 运行时函数比如malloc的代码并没有被放进LibA.lib里。放进LibA.lib的只是一个符号引用就像一个“欠条”或“空位”上面写着“我需要一个叫malloc的函数但我现在还没拿到它的代码等最后链接的时候请把它的代码填到这个空位来”。链接阶段当你把LibA.lib、LibB.lib和你的main.obj链接成myapp.exe时链接器看到了所有这些“欠条”。链接器的标准库路径里放着真正的libcmt.lib(静态CRT库的真实代码库)。链接器会从libcmt.lib中精确地取出一份malloc、free、std::string等函数的代码然后把所有LibA、LibB和main.obj中的“欠条”都指向这同一份代码。最终结果最终的myapp.exe里只包含了一份从libcmt.lib里提取出来的 C 运行时库的机器码。全局堆也只有一个。LibA、LibB和main.exe中的代码都使用这同一个堆来分配和释放内存。与“多个 DLL 静态链接”的对比用一张表格来清晰对比这两种看似相似、实则天差地别的情况场景链接方式最终产物运行时库副本数全局堆数量场景A (你之前的担心)多个DLL各自静态链接(/MT)A.dll,B.dll,main.exe3份(每个文件里都有一份)3个(运行时隔离)场景B (你现在的问题)多个静态库最终 EXE 静态链接(/MT)myapp.exe1份(只有 EXE 里有)1个(完全共享)为什么会有这种差异DLL 的边界是“高墙”DLL 是一个独立的二进制模块有自己独立的地址空间和初始化入口 (DllMain)。链接器无法跨越 DLL 边界去“合并”代码。因此每个静态链接的 DLL 都必须打包一份自己的运行时库并拥有自己独立的堆。静态库的边界是“虚线”静态库在链接前只是一堆文件。链接器可以随意将它们打散、合并、优化最终融合成一个单一的二进制文件。总结与最终建议如果你把多个使用/MT的静态库链接成一个使用/MT的 EXE完全安全。最终只有一个堆可以放心地跨库实际上是跨.obj文件分配和释放内存也可以自由地传递std::string、std::vector等 C 对象。回顾一下你之前的两个问题问题1exe (/MDd)dll (/MTd)-危险。问题2exe (/MTd)dll1 (/MTd)dll2 (/MTd)-危险。问题3exe (/MTd)静态库A (/MTd)静态库B (/MTd)-安全。这个对比清晰地揭示了 Windows 下 C 项目配置的核心原则问题几乎总是出在“可执行文件的边界”上。当你跨越一个.exe或.dll的边界去管理内存或传递 C 对象时必须确保两边使用的是完全相同的一份运行时库代码通常意味着全部动态链接/MD。而如果你把所有的代码无论有多少个静态库最终都“包”进同一个.exe或同一个.dll文件内部那么静态链接/MT就是一个简单、安全、自包含的选择。

相关文章:

VS运行时库配置区别(静态链接和动态链接区别)

VS中 配置项 MTD_StaticDebug和MTD_DynamicDebug有什么区别?已阅读 10 个网页MTd_StaticDebug 和 MDd_DynamicDebug 是 Visual Studio 中控制C/C 运行时库(CRT,C Runtime Library)链接方式的两种不同配置选项。简单来说&#xff0…...

Ironclad/Rivet:现代开发者的效率革命,从环境配置到工具链整合

1. 项目概述:从“铁甲”到“铆钉”,一个现代开发者的效率革命 如果你和我一样,常年混迹在代码仓库和命令行之间,那你一定对“工具链”这个词又爱又恨。爱的是,一套顺手的工具能让开发效率飞起;恨的是&#…...

基于Wechaty的插件化聊天机器人开发:从消息管道到指令系统

1. 项目概述与核心价值最近在折腾聊天机器人,特别是基于微信生态的自动化工具时,发现一个挺普遍的需求:如何让机器人更“聪明”地处理群聊里的各种指令和消息?很多开发者朋友都卡在消息路由、指令解析和状态管理这些繁琐的细节上&…...

Trae IDE 实战:打造“创建完美智能体助手”(交互式+自动生成+模板删减,新手无脑上手)

Trae IDE 实战:打造“创建完美智能体助手”(交互式+自动生成+模板删减,新手无脑上手) 前言:在AI研发提效浪潮中,Trae IDE的自定义Agent已成为开发者的核心协作工具。本文聚焦「创建完美智能体助手」的打造,全程贴合Trae原生能力,主打“交互式引导、全自动文件生成、模…...

AI赋能数字钱包:构建安全智能的DeFi资产管理助手

1. 项目概述:当AI遇上数字钱包,一场关于信任与效率的变革最近在关注Web3和数字资产管理领域的朋友,可能都注意到了“windagency/valora.ai”这个项目。乍一看,它像是一个托管在GitHub上的开源代码库,但深入探究后你会发…...

AEB系统有哪些应用场景?AEB系统有哪些感知方案

一旦检测到可能发生碰撞的情况,AEB系统会立即启动,自动触发车辆的制动系统,这便是AEB系统的作用。为增进大家对AEB系统的认识,本文将对AEB系统具体应用场景及相关信息予以介绍。如果你对AEB系统具有兴趣,不妨继续往下阅…...

FPGA实现JPEG-LS硬件编码器:架构、算法与工程实践

1. 项目概述:一个开源的JPEG-LS硬件编码器最近在翻看一些开源硬件项目时,看到了一个名为“FPGA-JPEG-LS-encoder”的仓库。这个项目由WangXuan95维护,从名字就能一眼看出,它是一个用硬件描述语言实现的JPEG-LS图像压缩编码器&…...

数据库查询语句的封装思路

import yamldef yamlread(path): # 打开并读取YAML文件with open(path, r, encodingutf-8) as file:config yaml.safe_load(file)return configc创建一个文件操作方法读取文件信息class dboperations:def __init__(self, config_pathrD:\PycharmProjects\PythonProject\config…...

数据结构--------单链表下

书接上回,本章主要讲的是单链表的头删,尾删,指定位置插入删除,链表的查找和链表的销毁;一.链表的操作1.头删文字描述如下:正所谓头删,删除的肯定是链表的头元素,但是我们要怎么样进行…...

2026年AI自动剪辑视频软件怎么选择?5款自动剪辑软件对比

对很多短视频创作者来说,真正耗时的不是拍摄,而是后期剪辑。素材整理、卡点、粗剪、字幕和批量导出,往往会占用大量时间。因此,“AI能不能自动剪辑视频”成为越来越多人在2026年搜索的问题。尤其对于新手、电商运营或内容团队而言…...

GitHub Awesome List:OpenClaw机器人抓取学习资源全导航

1. 项目概述:一个汇聚开源AI学习技能的宝藏库最近在GitHub上闲逛,发现了一个名为botlearn-ai/awesome-openclaw-learning-skills的仓库。这个标题乍一看有点长,但拆解一下,信息量巨大。“botlearn-ai”暗示了项目与AI学习相关&…...

Claude文本压缩可视化工具:揭秘LLM长文本处理与Prompt优化

1. 项目概述与核心价值最近在折腾大语言模型(LLM)应用开发,特别是围绕 Anthropic 的 Claude 系列模型时,我发现了一个挺有意思的开源工具——danielsod12/claude-compaction-viewer。简单来说,这是一个专门用来“可视化…...

【无人艇】基于SMC滑模控制的AUV自主水下机器人控制器研究Matlab、Simulink仿真实现

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。 🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室 👇 关注我领取海量matlab电子书和数学建模资料 &…...

云原生CLI工具Atlasclaw:统一多集群管理与容器镜像操作

1. 项目概述:一个为云原生环境打造的“瑞士军刀”最近在折腾云原生环境下的自动化运维和资源管理,发现很多工具要么太重,要么功能太单一,总感觉缺那么一把趁手的“瑞士军刀”。直到我遇到了CloudChef/atlasclaw这个项目&#xff0…...

Anthropic 推出面向小企业的 Claude:助力企业 AI 应用,拓展发展可能性

面向小企业推出 Claude2026 年 5 月 13 日,Anthropic 推出 [面向小企业的 Claude],这是一套含连接器和预运行工作流的解决方案,可将 Claude 集成到小企业依赖的工具中,助小企业主利用 AI 完成待办事项。小企业 AI 应用现状小企业贡…...

延世大学揭秘:为何AI记忆模型越用越“糊涂“?

这项由韩国延世大学(Yonsei University)研究团队完成的研究,以预印本形式发布于2026年5月,论文编号为arXiv:2605.07755,有兴趣深入了解的读者可通过该编号查询完整论文。当我们谈起人工智能处理长篇文字或复杂序列时&a…...

首尔国立大学:AI读完“书“就扔掉笔记,竟比一直抄笔记更聪明?

这项由首尔国立大学数据科学研究生院主导的研究,以预印本形式发布于2026年5月,论文编号为arXiv:2605.06105,有兴趣深入了解的读者可以通过该编号查询完整论文。每次你问AI一个问题,它都要先把你给它的所有材料从头到尾读一遍&…...

因促达促进长高作用原理

因促达促进长高的作用机理:因促达是生长因子促进剂(IGF-1 Promotion)与γ-氨基丁酸骨胶原蛋白肽压片糖果的组合,同时作用于GH-IGF-1生长轴的三个靶点,实现更全面、更直接、更有效的效果。针对生长轴的第一个靶点&#…...

ESP32-S3电源管理与CircuitPython开发实战:从硬件设计到低功耗优化

1. ESP32-S3电源管理:不只是供电,更是项目成败的关键玩嵌入式开发,尤其是物联网项目,最头疼的往往不是代码逻辑,而是“电”。一块板子,插着USB线跑得欢,一拔掉电池,没俩小时就歇菜了…...

C语言顺序结构入门:程序如何从上往下执行

顺序结构的程序设计是最简单的,只要按照解决问题的顺序写出相应的语句就行,它的执行顺序是自上而下,依次执行。例如:a3,b5,现交换a,b的值,这个问题就好像交换两个杯子水,…...

Mac上编译C语言的简易方法

1、 null 2、 在 Mac OS X 系统中,可通过 Xcode 学习和编写 C 语言程序。 3、 在Xcode中运行C语言程序需先创建项目,然后在项目中添加源代码文件。 4、 启动 Xcode,点击创建新项目以新建一个工程,具体操作所示。 5、 选择需创建…...

ViT模型压缩与加速技术:边缘计算部署实践

1. ViT模型压缩与加速技术概述视觉Transformer(ViT)模型近年来在计算机视觉领域取得了突破性进展,通过将图像分割为补丁序列并应用自注意力机制,实现了超越传统卷积神经网络(CNN)的性能表现。然而&#xff…...

PROFINET工业以太网:实时通信与设备互操作性解析

1. PROFINET技术架构解析PROFINET作为工业自动化领域的实时以太网标准,其核心价值在于解决了传统以太网在工业场景中的三大痛点:确定性延迟、实时性保障和设备互操作性。与普通办公以太网不同,工业环境要求通信系统必须满足严格的时序要求&am…...

助睿实验作业1:订单利润分流数据加工(零代码 ETL 完整流程)

前言 本文是我在完成 助睿数智(Uniplore)一站式数据科学实验平台 入门实验时的完整学习笔记。实验任务是将订单明细表与产品信息表关联,并根据利润正负将数据分流为盈利订单和亏损订单,最终输出到两个 Excel 文件中。全程使用零代…...

设计模式实战指南:从理论到工程落地的技能库构建

1. 项目概述:设计模式技能库的构建初衷最近在整理团队的技术资产,发现一个挺普遍的现象:很多同学在面试时能把设计模式的概念背得滚瓜烂熟,什么“单例模式确保一个类只有一个实例”,但一到实际项目里,面对稍…...

Chapter 13:企业实战 - 完整案例演练

Chapter 13:企业实战 - 完整案例演练 学习目标 掌握从需求分析到落地实施的完整流程 能够综合运用 Rules、Skills、MCP、Subagent 理解企业级项目的完整解决方案设计 具备独立设计企业扩展方案的能力 概念讲解(Why) 1.1 实战演练概述 案例背景: 某电商公司"极速商…...

VMware Workstation Pro 17免费激活全攻略:5000+密钥轻松上手虚拟化

VMware Workstation Pro 17免费激活全攻略:5000密钥轻松上手虚拟化 【免费下载链接】VMware-Workstation-Pro-17-Licence-Keys Free VMware Workstation Pro 17 full license keys. Weve meticulously organized thousands of keys, catering to all major versions…...

Windows系统自动化配置解决方案:WinUtil实战指南

Windows系统自动化配置解决方案:WinUtil实战指南 【免费下载链接】winutil Chris Titus Techs Windows Utility - Install Programs, Tweaks, Fixes, and Updates 项目地址: https://gitcode.com/GitHub_Trending/wi/winutil 在当今数字化工作环境中&#xf…...

Poppins字体技术解析:跨语言几何字体的架构设计与实战应用

Poppins字体技术解析:跨语言几何字体的架构设计与实战应用 【免费下载链接】Poppins Poppins, a Devanagari Latin family for Google Fonts. 项目地址: https://gitcode.com/gh_mirrors/po/Poppins 在全球化数字产品设计中,如何为多语言用户提供…...

10分钟精通rpatool:掌握Ren‘Py游戏资源管理的核心技术

10分钟精通rpatool:掌握RenPy游戏资源管理的核心技术 【免费下载链接】rpatool (migrated to https://codeberg.org/shiz/rpatool) A tool to work with RenPy archives. 项目地址: https://gitcode.com/gh_mirrors/rp/rpatool rpatool是一个专门处理RenPy游…...