CMake构建实战:核心逻辑、依赖管理与排错指南
你有没有过这种经历一个项目从单个 main.cpp 变成十几个目录编译命令从一行 g 变成一长串带路径的参数最后谁也不愿意去碰构建脚本。我在这场混乱里挣扎了很久最后老老实实把整个工程的构建交了给 CMake 这一层“元构建工具”管理从此所有平台共用同一份 CMakeLists.txt新环境拉下来跑两条命令就能编译。这篇文章从实际经验出发讲清楚 CMake 的核心逻辑、一份能上线的配置长什么样、第三方库怎么找以及配置报错时如何一步步把问题揪出来。无论你是刚接触 C/C 构建还是已经写过一段时间 CMake 但总觉得这工具像黑盒这篇内容都值得往下翻。1. CMake到底在解决什么问题构建配置为什么会被它接管1.1 它不编译它只生成“构建系统的描述文件”一个常被忽略的事实是CMake 自己并不编译代码。真正干活的是编译器命令行而 CMake 负责根据你写的描述生成一套能被 Make、Ninja、各种 IDE 工程格式驱动的“构建脚本”。也就是说你在源目录写 CMakeLists.txt它把这些规则翻译成具体环境下的构建动作再交给底层工具执行。拿我早期习惯来说项目小的时候直接写 Makefile 挺顺手一个文件里塞几个 target 也能跑。但项目开始需要同时支持 Linux 和 Windows或者要切到 IDE 打开工程时Makefile 的短板立刻暴露不同平台有各自的语法、各自的环境变量、各自处理动态库的方式。维护多套脚本的痛苦远比写脚本本身要大。CMake 把这个问题拆成了三层你只维护一份与平台无关的描述CMake 在“配置阶段”解析这份描述生成器在“生成阶段”输出当前平台需要的构建文件。之后再执行真正的编译链接工作。这份抽象描述就是 CMakeLists.txt它才是你要长期维护的核心资产。1.2 一切围绕 target 来组织不要一上来就全局变量我见过不少初学者把 CMake 当成一种“脚本语言”来写习惯定义一堆全局变量、到处 set最后整个 CMakeLists.txt 变成一张巨大的赋值表。这种做法在小型项目里能撑住一旦目录多起来变量之间的依赖关系会变成一团乱麻。CMake 的正确组织单位是 target。一个 target 可以是一个可执行文件、一个静态库、一个共享库也可以是自定义的命令目标。现代 CMake 提倡“面向目标”的配置方式所有编译选项、头文件目录、宏定义、链接库都尽量挂在 target 上而不是散落在全局。为什么要这样做因为 target 提供了作用域和信息传递的边界。比如一个 core 库被 app 可执行文件链接core 对外需要暴露的头文件路径、编译宏可以通过 PUBLIC 传递下去核心内部自己才用的编译选项可以留在 PRIVATE 范围里。一旦把信息挂在全局所有 target 都会受影响项目一大就会出现“不知道为什么某个编译定义流窜到了所有文件”的灵异现象。1.3 configure、generate、build 三段式建立心智模型对新手来说理解 CMake 的命令流程比记住某个函数更重要。三步分别是配置、生成、构建。配置阶段读取 CMakeLists.txt检查编译器、依赖库、选项把一个叫 CMakeCache.txt 的缓存文件写到指定的 build 目录里。生成阶段根据配置结果和当前生成器输出构建脚本比如 Makefile、Ninja.build 或 IDE 工程文件。构建阶段执行真正的编译和链接由你选择的生成器负责。命令行对应关系也非常直白cmake -S . -B build cmake --build build第一条命令同时完成配置和生成第二条命令执行构建。以后每次改完源码只需重新执行第二条只有当你改了 CMakeLists.txt、编译器或依赖路径时CMake 才会在下次构建时自动重新跑配置逻辑。把 build 目录单独隔离出来还有个好处你可以在同一个源码目录旁边建立 debug 和 release 两个 build 目录互不干扰。源码树里不会出现一堆 .o 文件和可执行文件干净也方便清理。2. 第一份能上线的 CMakeLists.txt目录、目标与依赖关系2.1 最小骨架与常用信息标记我习惯一个工程至少分成两层顶层 CMakeLists.txt 负责项目信息、全局选项和总结构子目录里的 CMakeLists.txt 负责具体模块。下面是一个最小但完整的骨架很多实际项目的第一版就这么演化出来的。cmake_minimum_required(VERSION 3.16) project(demo_project VERSION 0.1.0 LANGUAGES C CXX ) add_library(core STATIC src/core.cpp ) target_include_directories(core PUBLIC include) target_compile_features(core PUBLIC cxx_std_17) add_executable(app src/main.cpp ) target_link_libraries(app PRIVATE core)第一行的 cmake_minimum_required 用来声明 CMake 的最低版本。它有实际意义一些旧指令在低版本里有不同的行为后续代码如果用了新特性但用户机器上的 CMake 太老项目会直接报错或行为异常。project 指令设置工程名、版本号和语言。配置了版本号之后可以用 PROJECT_VERSION 这类变量在整个配置过程中引用比如生成版本头文件时很常用。指定 LANGUAGES 可以避免 CMake 默认尝试检测 C 和 CXX 之外的额外语言配置速度快一点。2.2 头文件搜索路径PUBLIC、PRIVATE、INTERFACE 的区别刚才那段代码里用到了 target_include_directories这是新手最容易用错的地方。很多老教程建议直接写 include_directories把某个目录塞进全局搜索路径。这样做短期内能编译过但长期会破坏目标之间的边界。我认为最关键的是理解三个关键词PRIVATE只对当前 target 本身生效。比如 core 内部要用到 third_party 下的目录消费者不需要知道。PUBLIC当前 target 和所有链接它的 target 都会获得这个目录。这个最常用因为你库里对外暴露的头文件通常需要让调用方找到。INTERFACE当前 target 自己不需要但链接它的 target 需要。典型场景是纯头文件库或者一个自定义 target 只是把一组编译选项传递给依赖方。直观说明一下假如 core 库编译时需要 util 目录但 app 只需要 core/include那就写两条target_include_directories(core PUBLIC include ) target_include_directories(core PRIVATE util )这样 core 内部能找到 util而 app 只被传递了 include 路径不会意外获得 core 私有目录。这种信息隔离能让编译错误提前暴露在应该出现的位置上。2.3 多目录组织的 add_subdirectory 与作用域规则当工程继续变大我会把不同模块拆成目录每个目录放自己的 CMakeLists.txt。顶层文件里用 add_subdirectory 逐个引入add_subdirectory(src/core) add_subdirectory(src/app)这里必须理解作用域规则否则会遇到各种变量“好像失效了”的问题。add_subdirectory 会开启一个新的子作用域子目录能读到父目录定义的所有变量但子目录里用 set 新建的变量默认不会被父目录看到。只有显式写 set(... PARENT_SCOPE) 才会把变量传回去。更麻烦的是函数调用、宏调用各自有独立作用域。所以我现在的习惯是尽量不用大量字符串变量传递信息而是靠 target 之间的属性传递。target 是全局注册的子目录里创建的库父目录和同级目录都能直接引用天然绕开了变量作用域带来的坑。3. 第三方库的查找与链接find_package 里藏着的优先级3.1 先搞懂两种模式模块模式和配置模式几乎所有需要在项目里接入第三方库的工程都会遇到 find_package。这个指令表面上很简洁比如find_package(demo_log CONFIG REQUIRED)但它背后有两种完全不同的工作模式。第一种是模块模式CMake 会在 CMAKE_MODULE_PATH 里找 Find名称.cmake 文件并执行这个文件里写的搜索逻辑第二种是配置模式CMake 会找到安装第三方库时生成的 名称-config.cmake 或 名称Config.cmake然后读取里面导出的 target 和变量。区分这两者很重要。模块模式经常是手工维护的系统里没有现成的配置文件需要你自己在 Find 脚本里设置 include 劝入库路径、链接库名称。配置模式则通常是库作者随安装包提供的质量更高也更现代。现在的推荐写法是显式注明 CONFIG避免模棱两可地先去尝试模块模式。明确告诉 CMake“别猜了去找配置文件”。这样如果找不到报错信息会更直接地指向路径问题。3.2 找到之后优先用 imported target当配置模式成功时第三方库通常会导出一个或多个 imported target比如 demo_log::demo_log。链接一个 imported target 时它会自动带上这个库需要的头文件路径、库文件路径以及传递依赖。find_package(demo_log CONFIG REQUIRED) target_link_libraries(app PRIVATE demo_log::demo_log)如果第三方库比较老没有导出 target只能退而求其次用变量常见的是 名称_INCLUDE_DIRS 和 名称_LIBRARIES。这时你需要在 target 级别手动关联。target_include_directories(app PRIVATE ${demo_log_INCLUDE_DIRS}) target_link_libraries(app PRIVATE ${demo_log_LIBRARIES})能用 imported target 就尽量不要手动拼变量。imported target 属于 CMake 的“一等公民”依赖传递、构建类型差异、运行时路径处理都会被自动管理少写很多判别逻辑。3.3 找不到库时按顺序检查这些路径我经常遇到“find_package 失败”的问题绝大多数原因就三个路径没告诉 CMake、库没装、库的版本不匹配。排查顺序也很机械从影响范围最大的开始。第一步确认 CMake 搜索路径。在配置命令里加参数是临时验证最方便的方式cmake -S . -B build -DCMAKE_PREFIX_PATH/opt/demo_log如果成功说明库就安装在那里。接下来可以把 CMAKE_PREFIX_PATH 写进缓存或预设里而不是到处塞硬编码路径。第二步如果库的配置文件是分散安装的用更精确的变量直接指向配置文件所在目录cmake -S . -B build -Ddemo_log_DIR/opt/demo_log/lib/cmake/demo_log第三步再考虑是不是真没装对版本。有些库多个版本共存时头文件和库文件路径会不一致这种时候最省事的办法是让 CMake 通过 pkg-config 做一次辅助探测或者用小工具清理系统里的重复旧版本。我个人的规则是路径问题优先级高于代码问题因为报错常常是同一个提示但根因完全不一样。4. 排错记录配置失败时的分析链路和日志观察方法4.1 从第一个错误开始看不要在输出尾巴上打转配置失败时终端里经常刷出一大片红色。很多人的第一反应是从最后一行往上读这可能让排查陷入误区。CMake 的错误输出大多是连锁反应第一个错误引发后续一堆报错后面的内容往往只是噪音。比如一次 find_package 找不到库后面会出现很多“无法找到头文件”“无法生成导入目标”的提示。如果你只盯着最后的“头文件缺失”看会绕路去修改头文件路径但实际根因是 find_package 没成功。我在排错时会立刻把命令重跑一遍这次带着责任感的做法是只用单条输出快速定位cmake -S . -B build 21 | head -n 50只看输出最前面几十行通常能抓到第一个真正的错误。配置过程是线性的前一个步骤的失败会导致后续步骤做无用功。所以先修根因再滚掉后续错误。4.2 缓存变量引发的“明明改了却不生效”这个坑几乎所有人都会踩你在 CMakeLists.txt 里修改了一个变量重新构建发现行为还是旧的。原因基本都出在 CMakeCache.txt 上。CMake 会把配置阶段的变量值存到一个缓存文件里保存在 build 目录中。一旦某个变量被写入缓存后续重新配置时就不会自动覆盖它。如果你想改变缓存值要么在命令行用 -D 显式指定新值要么删掉缓存文件让它重新生成。我个人处理怀疑缓存引起的问题时会先不动原 build 目录创建一个新的 build 目录重新配置。如果新目录一切正常那就基本能判定是缓存残留。这种做法比直接删 build 目录更安全万一新目录也复现问题原来的目录还能保留现场。清理缓存也有讲究有时候只需要删 CMakeCache.txt 和 CMakeFiles 目录有时候干脆整个 build 目录重建更清爽。不过全删再配置需要重新编译所有东西浪费时间所以我一般是先试新目录确认根因再回到原目录做精准清理。4.3 用 message 和 trace 选项看清 CMake 到底走了哪条路CMakeLists 本质上也是一段代码既然是代码就一定需要调试手段。最常用的就是 message 指令message(STATUS demo_log_DIR ${demo_log_DIR}) message(STATUS CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH})STATUS 级别打印的信息不会污染错误流适合确认变量值。如果你的问题是“为什么这段分支没有进入”“为什么这个条件判断不对”可以在分支前后各打印一行。这种做法虽然土但确实能解决绝大多数配置逻辑问题。如果变量太多了不想手动加可以用命令行参数观察每一步。--trace-expand 会把 CMake 执行的每一条指令以及展开后的参数全部打出来信息量很大。配合 --trace-source某个文件 可以把范围限制到指定文件输出就不会那么爆炸。我通常先用 source 限定文件看整体逻辑再用 --trace-expand 对可疑片段做细查。4.4 常见报错与排查思路一览下面这张表是我这些年处理过的大多数 CMake 配置问题的浓缩版本不一定覆盖所有情况但可以当一张快速索引。报错特征常见原因快速排查路径fatal error: xxx.h: No such file or directory头文件路径没有传到当前 target检查 target_include_directories 用的是不是 PUBLIC或头文件是否已安装到 include 目录undefined reference toxxx链接库缺失或链接顺序不对确认 target_link_libraries 写在目标定义之后且链接库顺序正确Could not find a package configuration file ...配置模式找不到库的 config 文件检查 CMAKE_PREFIX_PATH或直接指定 名称_DIRNo rule to make target xxx目标名拼写不一致或生成文件过期核对 add_library/target 拼写必要时重建新 build 目录policy CMPxxxx is not set多版本 CMake 兼容策略问题升级 cmake_minimum_required 到明确版本或显式设置 cmake_policyerror: use of undeclared identifier ...编译宏未定义或未传递检查 target_compile_definitions 的 PRIVATE/PUBLIC 设置排查这些错误时我还有一个很实用的习惯先确认 CMake 版本。cmake --version因为低版本 CMake 对某些指令的支持不同同一份 CMakeLists.txt 在不同版本下走的分支可能都不一样。很多“在 A 机器能过在 B 机器过不了”的问题最后都落在版本差异或缓存残留上而不是真正的代码逻辑。5. 让项目可以交给别人的安装、测试与预设配置5.1 安装规则从源码目录到使用目录一个项目写完如果只有你自己能用那还算不上真正完成。让别人也能编译、安装、链接是工程化的重要一步。安装规则的写法并不复杂install(TARGETS app core RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib ) install(DIRECTORY include/ DESTINATION include FILES_MATCHING PATTERN *.h )这里把可执行文件和库文件分别装到对应目录再把公共头文件整体复制过去。别人拿到安装后的目录后不需要看到你的源码结构只需要 include 和 lib 两个目录就能编译自己的代码。安装目录默认是系统级别的路径但如果你不希望污染系统目录可以随时用 CMAKE_INSTALL_PREFIX 指定归属地cmake --install build --prefix /opt/demo_project这里要注意安装规则里写的路径都是相对目录最终解释权交给前缀。不要手写绝对路径否则项目迁移到别处会出现路径硬编码问题。5.2 测试与 CTest让回归测试成为构建体系的一部分如果工程还没配置测试我会建议尽早加入 CTest。它的好处是零成本地把测试运行统一起来配合 CI 也很方便。启用方式非常简单include(CTest) if(BUILD_TESTING) add_executable(smoke_test tests/smoke_test.cpp) target_link_libraries(smoke_test PRIVATE core) add_test(NAME smoke_test COMMAND smoke_test) endif()include(CTest) 会定义 BUILD_TESTING 选项默认开启。每个可执行测试通过 add_test 注册到 CTest 框架里之后只需一条命令就能跑所有测试ctest --test-dir build --output-on-failure我习惯让每个测试文件保持独立的小目标这样失败时可以单独看到底是哪个用例挂了。如果在测试里用到了共享库记得给测试目标也链接完整否则运行时会因为找不到动态库而报错那种错误跟编译错误完全是两回事。5.3 CMakePresets把常用参数固化下来每次构建都敲一长串命令行参数确实容易出错。CMake 从 3.19 开始的预设机制解决了这个痛点。在源码根目录放一个 CMakePresets.json就能把常用的配置组合存下来。{ version: 3, configurePresets: [ { name: dev, displayName: Development build, generator: Ninja, binaryDir: ${sourceDir}/build/dev, cacheVariables: { CMAKE_BUILD_TYPE: Debug, ENABLE_TESTS: ON } } ], buildPresets: [ { name: dev, configurePreset: dev } ] }配置好之后整个构建流程可以收敛成两条命令cmake --preset dev cmake --build --preset dev预设还能支持工具链文件的切换。比如要交叉编译某个嵌入式目标时我会加一个交叉编译预设在里面指定 CMAKE_TOOLCHAIN_FILE。这样团队成员就不会每次手动传参也不会因为有人忘了传导致配置结果不一致。预设的核心价值不在于省几个字符而在于让构建流程在团队里形成唯一确定版本。多写几个预设其实是值得的。我一般会维护 debug、release、带测试三个预设既能满足日常迭代也能在 CI 中直接引用同一个配置文件避免 CI 脚本和本地构建逻辑发生偏差。不过要注意presets 文件最好纳入版本管理且只在稳定的顶层目录里维护一份主版本免得每个子模块都定义自己的预设互相打架。写到这里我最想保留的一条经验是CMake 的学习曲线没有想象中陡它只是把原来散落在命令行里的事情集中了起来。抓住 target 这个全局视角理解配置阶段和构建阶段的分离再去查资料时你会发现每个函数都能对号入座。遇到配置报错不要慌先看第一个错误再用 message 确认变量状态把当反射式排查当成日常习惯。最后分享一个小技巧当你在一个大型工程里改了某条依赖链却不想全量重新编译时可以先用cmake --build build --target 目标名只构建和重链相关的目标而不是每次都默认全量构建。配合读代码块的有效信息能省掉不少等待时间。CMake 这条探索路径很长但每走一段都会让你后续维护工程轻松一大截。

相关新闻

多模态情感分析实战:基于Python的文本语音图像视频融合指南

多模态情感分析实战:基于Python的文本语音图像视频融合指南

简介:一套基于Python实现的多模态融合情感分析项目资源,面向毕业设计、课程作业等学生开发者,解决文本、语音、图像与视频四类输入下的情感识别与融合分析问题。资源共包含21个文件,整体56.86MB,其中Python脚本承担数据…

2026/10/11 19:47:43 阅读更多 →
JWT Payload与Claims详解:从三段结构到七个标准字段的工程实践

JWT Payload与Claims详解:从三段结构到七个标准字段的工程实践

几乎所有写过后端接口的开发者,都经历过这样一个场景:登录接口返回了一长串token,你把它粘贴到jwt.io上,中间那段Base64字符串里清清楚楚写着用户ID、角色、过期时间,有时候甚至能看到手机号和邮箱。那段字符串就是JWT…

2026/10/11 19:47:43 阅读更多 →
管道焊缝缺陷检测数据集:YOLOv5格式解析与训练实战

管道焊缝缺陷检测数据集:YOLOv5格式解析与训练实战

简介:这份资源面向从事工业质检、缺陷识别方向的目标检测学习者与工程人员,提供管道焊接缝缺陷检测数据集,按YOLOV5目录格式整理,可直接投入训练,省去格式转换与标注清洗的繁琐环节。数据为800800的RGB图像&#xff0c…

2026/10/11 19:47:43 阅读更多 →

最新新闻

改进版Q-learning实战:Double Q、n步回报与经验回放

改进版Q-learning实战:Double Q、n步回报与经验回放

简介:基于Q-learning的改进版强化学习算法项目,聚焦路径规划场景,面向MATLAB用户及强化学习入门者。项目针对经典Q-learning收敛慢的问题,融合学习率衰减、动态ε-greedy探索、经验回放、目标网络与双线性更新等改进策略&#xff…

2026/10/11 23:38:45 阅读更多 →
定时任务从Crontab到XXL-JOB:选型、实现与运维避坑指南

定时任务从Crontab到XXL-JOB:选型、实现与运维避坑指南

定时任务这个东西,我在不同项目里来来回回用了好多年。最早是拿 shell 脚本挂着 crontab 跑,后来做 PHP 后台管理系统时研究过 likeadmin 这类框架里定时任务的执行机制,再到现在维护 SpringCloud 集群,又得面对分布式定时任务怎么…

2026/10/11 23:38:45 阅读更多 →
VOC垃圾检测数据集14963张:Darknet训练YOLO全流程指南

VOC垃圾检测数据集14963张:Darknet训练YOLO全流程指南

简介:面向YOLOv3/v4/v5及Darknet框架训练需求,这份VOC格式垃圾分类数据集提供了完整的图片、标注与标签体系。数据集中包含14963张垃圾图片,每张均对应同名xml标注文件和yolo格式txt文件,合计44类全英文标签,并额外提供…

2026/10/11 23:38:45 阅读更多 →
社交网络链路预测实战:Python图算法与VGAE工程化指南

社交网络链路预测实战:Python图算法与VGAE工程化指南

简介:本资源是一套面向高校本科生与研究生的社交网络链路预测实践项目,适用于毕业设计、课程设计及科研入门场景,聚焦图神经网络与传统相似性指标在关系预测中的建模与对比分析。压缩包含345个文件,总大小33.94MB,其中…

2026/10/11 23:38:45 阅读更多 →
HarmonyOS 7 GridRow:折叠屏筛选面板断点抖动门禁【鸿蒙心迹】

HarmonyOS 7 GridRow:折叠屏筛选面板断点抖动门禁【鸿蒙心迹】

相册筛选页最难解释的状态异常,有时并不出现在网络请求上。用户只是把折叠屏展开、收回,再展开,原本已经勾好的“城市、夜景、建筑”仍然亮着,结果列表却突然刷新两遍。更糟糕的是,第一次请求还没回来,第二…

2026/10/11 23:38:45 阅读更多 →
Q-learning改进版全解析:目标网络、经验回放与Double Q实战

Q-learning改进版全解析:目标网络、经验回放与Double Q实战

简介:这份资源是基于Q-learning改进的强化学习算法实现,开发工具为MATLAB,面向路径规划与人工智能学习者,适合机器人导航、网格寻路、游戏AI等场景下的最优策略求解问题。ZIP压缩包共包含21个文件,以19个.m脚本为核心&…

2026/10/11 23:37:44 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →