C++跨平台开发实战:从CMake配置到Linux/Windows构建避坑指南
我做C跨平台开发LinuxWindows这两年最深的体会是跨平台不是“一劳永逸”而是一套需要提前设计的工程方法。你不可能等代码写完了再用编译开关去“补兼容”而是要从构建系统、源码结构、依赖管理、发布方式这几个层面同时动刀。这篇文章就把整个过程从头拆一遍讲清楚哪些坑可以提前避开哪些问题必须在架构期就想明白也补上具体能落地的CMake配置、编译选项和调试技巧。它适合刚开始做跨平台项目的朋友也适合已经在Windows和Linux两边反复编译、被各种历史包袱折磨得头大的同学。1. 跨平台C开发的整体设计思路1.1 为什么跨平台项目十有八九选择C很多人一提到跨平台第一反应是换脚本语言或者托管语言。但现实是高性能计算、底层引擎、嵌入式设备、服务端中间件、图像处理、金融交易系统这些领域计算密度和安全要求摆在那里C几乎是绕不开的选项。原因很简单C能同时提供接近硬件的资源控制能力和足够高的抽象层次而且标准化程度高主流的三大编译器——GCC、Clang、MSVC——对标准支持都相当到位。但C也是少数“写起来爽、跨起来痛”的语言。同样的语法在不同平台上的行为差异、ABI差异、工具链差异会让同一份代码在Linux上丝滑编译、到了Windows上哭爹喊娘。这也是为什么我在项目开工之前第一件事不是写业务而是先定完整的工程骨架。提示如果项目预算和团队能力都有限纯C跨平台会消耗额外工作量。但如果你评估后确定性能是硬指标那就认了这条路把兼容性当作一等需求来设计。1.2 跨平台开发必须面对的三类差异跨平台问题表面看是“同一段代码在不同系统上跑不过”拆开看其实分三类每一类的处理思路都不太一样。第一类是编译器差异。Linux上最常见的是GCC和ClangWindows上是MSVC。它们在标准库实现细节、警告级别、优化选项、预处理器宏上都有差异。比如说GCC对未使用返回值默认只是警告但MSVC在有些版本会把某些告警当成错误。Windows上还分Debug/Release、动态运行时/静态运行时一不小心就链接错库。第二类是操作系统API差异。文件路径格式、动态库加载、环境变量处理、网络套接字初始化、进程线程API这些在Linux和Windows上完全是两套体系。Linux下动态库是.soWindows下是.dll命名规则也完全不同。Windows的socket还要先WSAStartupLinux直接用一套POSIX调用。第三类是标准库之外的生态差异。第三方依赖库在Linux上安装有包管理器在Windows上往往要自己编译或者用包管理工具拉预编译包。库的发布形态、头文件搜索路径、运行时依赖分布这些比源代码本身更容易踩坑。1.3 用抽象层替代野蛮ifdef很多人处理平台差异的第一反应是堆一堆#ifdef _WIN32。短期能跑长期就是灾难。代码里到处是平台分支业务逻辑和平台细节混在一起后面加一个新平台或者换一个编译器改都不知道从哪改起。我常用的思路是把平台差异收拢到独立的“平台抽象层”业务代码只依赖抽象接口不直接接触系统API。比如需要做文件监控就抽象一个WatchDirectory接口在Linux用inotify实现在Windows用ReadDirectoryChangesW实现上层业务看到的永远是同一个接口。真正需要ifdef的地方集中在几个小文件里比如平台宏定义头、动态库导出宏、socket初始化封装。这样业务代码保持干净平台细节改动只在少数文件里发生测试和调试成本都会低一个量级。注意不是所有平台差异都要抽象。像编译器警告和字节对齐这类差异应该用统一的编译选项去抹平而不是靠代码绕。抽象层要用在真正稳定、可复用的边界上否则就是过度设计。2. 构建工具链的选型与配置实操2.1 为什么构建系统几乎都选CMake跨平台C项目里CMake基本是事实标准。它本身是一个构建系统生成器不直接编译代码而是生成目标平台能识别的构建文件在Linux上可以生成Makefile也可以生成Ninja文件在Windows上可以生成一个大工程文件也可以生成Ninja文件。这意味着你只要写一份CMakeLists.txt就能管理两个平台的构建流程。用CMake另一个好处是依赖管理。现代CMake支持FetchContent和find_package可以把第三方库的获取和链接过程统一起来。团队内部还可以用install规则和package config文件做一个私有的依赖分发机制不用每个成员手动装库。我的经验是项目一上来就要规定CMake最低版本。太低用不了现代特性太高影响别人环境。我个人习惯是3.16起步支持target_*命令相对完整再往上按需升级。2.2 CMakeLists.txt最小可运行版本一个跨平台项目最基础的CMakeLists.txt只需要几段配置。下面是可参考的骨架我没写复杂库直接做一个可执行程序加一个静态库方便你理解脉络。cmake_minimum_required(VERSION 3.16) project(MyCrossApp LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) set(CMAKE_BUILD_TYPE Release CACHE STRING Build type FORCE) endif() add_library(core STATIC source/core.cpp source/platform_win.cpp source/platform_linux.cpp ) target_include_directories(core PUBLIC include) if(WIN32) target_compile_definitions(core PRIVATE _CRT_SECURE_NO_WARNINGS) target_compile_options(core PRIVATE /W4 /permissive-) else() target_compile_options(core PRIVATE -Wall -Wextra -Wpedantic) endif() add_executable(app source/main.cpp) target_link_libraries(app PRIVATE core)说几个容易被忽略的细节。第一CMAKE_CXX_EXTENSIONS OFF一定要设置它禁止编译器使用平台私有扩展保证你的代码能同时被MSVC和GCC接受。第二CMAKE_BUILD_TYPE在单配置生成器上要显式处理否则默认是空字符串到了Windows多配置生成器又会自动使用Debug/Release配置两边行为对不上。第三Windows上的_CRT_SECURE_NO_WARNINGS不是必须的但如果你用了老式C函数且不想被警告淹没提前定义它省心。2.3 编译器探测与平台宏的正确用法CMake里经常要判断“当前是不是Windows”“当前是不是MSVC”。很多人直接写if(WIN32)但WIN32这个变量在64位系统上也为真它表达的是“目标平台是Windows”而不是“目标系统位数”用起来没问题。真正区分编译器要用MSVC和CMAKE_CXX_COMPILER_ID。if(MSVC) # MSVC特定选项 elseif(CMAKE_CXX_COMPILER_ID MATCHES GNU|Clang) # GCC / Clang 的选项 endif()源码里也需要类似的宏。跨平台代码里最常见的三个宏是_WIN32、__linux__和__GNUC__。注意_WIN32是编译器定义的不是CMake变量但它同样在32位和64位Windows下都可用。还要区分一个细节_WIN32不能用来判断是不是MSVC因为MinGW编译器在Windows下也会定义_WIN32。判断MSVC要用_MSC_VER。#if defined(_WIN32) // Windows平台包括MSVC和MinGW #if defined(_MSC_VER) // 专属于MSVC的逻辑 #endif #elif defined(__linux__) // Linux平台 #endif2.4 第三方依赖的分发与定位跨平台项目里第三方依赖是最大的变量。Linux上你可以依赖包管理器安装但Windows用户的环境千差万别同一个库在不同机器上版本可能完全不同。我踩过很多次“本地能编译同事编译不过”的坑后来统一改成这样尽量用CMake的FetchContent拉取源码并本地编译。虽然第一次构建会慢一点但每个开发者的依赖版本完全锁定再也不存在环境漂移。如果公司不允许源码拉取那就用vendoring方式把第三方库源码放进项目仓库统一用add_subdirectory编进项目。这样避免对外部包管理工具的强依赖缺点是仓库体积变大、升级库版本时要人工同步。实操心得不要在一台机器上同时用包管理器安装的OpenSSL和源码编译的OpenSSL。同一个库被重复编译或者链接到两份不同副本运行时经常是“找不到符号”甚至内存错乱排查起来极其痛苦。依赖来源要统一。3. 让代码真正在两个平台跑起来的核心细节3.1 路径、换行符和文件命名这些“小事”跨平台开发最容易翻车的地方往往不是高级特性而是文件路径和换行符。Linux的路径分隔符是/Windows既有\也有/大多数Windows API能接受正斜杠但仍有一小部分系统和库只认反斜杠。最稳妥的办法是不要在代码里写死分隔符用标准库拼路径。#include filesystem namespace fs std::filesystem; fs::path configPath fs::path(conf) / fs::path(app.ini); std::string configFile configPath.string();std::filesystem::path会根据当前平台自动选择正确的分隔符/运算符还能处理掉多余的分隔符。这里要提醒一句把path转成string以后再塞给一些老式C库行为仍可能不同尽量让库接口也走path类型或者统一转成u8string做编码转换。换行符的问题隐蔽但杀伤力大。Windows默认是\r\nLinux是\n。文本文件进了git如果autocrlf设置没统一经常出现“文件没改过但diff一大片”的情况。代码层面尽量以\n为内部统一格式版本控制配置里固定行尾策略别让成员各自为战。3.2 动态库导出Windows的__declspec与Linux的visibility跨平台动态库是另一个经典雷区。Linux编译动态库时默认情况下全局符号都是对外可见的Windows编译DLL时默认符号不导出必须显式用__declspec(dllexport)标注。反过来在使用方那边MSVC要求用__declspec(dllimport)做导入声明这导致很多库需要一套跨平台的导出宏。#if defined(_WIN32) # if defined(MYLIB_BUILD) # define MYLIB_API __declspec(dllexport) # else # define MYLIB_API __declspec(dllimport) # endif #else # define MYLIB_API __attribute__((visibility(default))) #endif class MYLIB_API CoreProcessor { public: void Run(); };同时Linux上如果你不想把内部符号都暴露出去建议编译时加-fvisibilityhidden只让标了MYLIB_API的符号可见。这样能减小动态库导出的符号表也避免和别的库符号冲突。Windows那边不用太担心毕竟不导出就默认隐藏。3.3 用标准库统一平台差异文件系统、线程、网络C17以后很多原来必须调系统API的东西在标准库里就能完成。文件系统用std::filesystem线程用std::thread和std::mutex时间用std::chrono这些在Windows和Linux上的行为已经高度一致。能用标准库解决的就不要自己封装因为标准库是最小的公共依赖。线程这块有一个隐藏差异Linux的pthread需要手动管理线程栈大小Windows在创建线程时也有栈大小参数但std::thread默认都不暴露这些细节一般场景够用。如果线程栈特别大或者并发特别多建议直接用底层API否则标准库的抽象会更省事。网络是要单独说的。标准库目前没有跨平台的网络接口所以跨平台项目一般选专门的网络库。选择标准很简单它必须同时支持Windows和Linux的异步IO模型最好在SSL、DNS解析、代理这些细节上已经抹平了差异。实际开发中网络库的选型直接影响跨平台工作量选不好就是另一个大坑。3.4 固定位宽类型、对齐和字节序跨平台最容易产生隐性bug的是基础数据类型宽度。int在Windows和Linux上都是4字节但long在Windows上是4字节、Linux 64位上是8字节size_t和指针宽度都是8字节。一旦代码里出现“把long当4字节用”或者“把size_t当int传”到对面平台就出事。解决办法是使用C标准里的固定位宽类型int32_t、uint16_t、int64_t。也要注意size_t和ssize_t的区别后者在Windows上不是标准自带。做文件读写、网络协议、内存映射时一律用固定宽度类型并且显式做字节序转换。还要提一嘴对齐MSVC的默认对齐和GCC不完全一致传递结构体到系统API时最好用alignas或者#pragma pack明确控制。4. 实战从零搭建并跑通Linux与Windows构建4.1 Linux侧构建与调试操作记录Linux上我一般用CMake加Ninja这套组合。Ninja比默认的Unix Makefiles快很多增量编译体验也好。构建命令固定下来团队内部就按同一套操作走。cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPEDebug cmake --build build编译通过之后再用调试器跑程序。我用命令行调试的时候习惯先给程序传参数设置断点然后跑起来看调用栈。打断点放在怀疑对象的入口确认入参和返回值一步步缩小范围。Linux下还有一个好用工具是崩溃时生成core dump开起来之后程序崩了能直接看到崩溃现场省掉很多冤枉排查时间。4.2 Windows侧构建与调试操作记录Windows侧我习惯用CMake生成对应平台的原生工程文件或者Ninja文件然后在IDE里打开调试。注意字符串编码问题Windows控制台默认代码页和文件编码可能不一致代码里打印中文字符容易乱码先确认源码文件保存成UTF-8并在程序入口设置UTF-8代码页。Windows调试和Linux最大区别是符号文件。PDB文件要保留好崩溃转储文件配合PDB才能还原调用栈。我一般会把Debug构建的PDB自动存档到文件服务器线上还是测试环境都要能拿出来。cmake -S . -B build -G Visual Studio 17 2022 -A x64 cmake --build build --config Debug构建完以后把生成的exe、dll、pdb归到同一个目录。Windows运行程序找DLL是按目录顺序搜索的依赖库放到exe同目录最省心别指望PATH。注意事项Windows侧的运行时库一定要统一。MD和MT不能混用。一个模块用动态运行时、另一个模块用静态运行时链接能通过但内存分配释放跨模块传递时会出诡异崩溃。CMake里可以用CMAKE_MSVC_RUNTIME_LIBRARY统一控制。4.3 自动化构建与持续集成的现实考虑跨平台项目如果没有自动化构建光靠本地编译验证迟早翻车。CI里最好同时跑两个平台的构建一个跑在Linux容器一个跑在Windows虚拟机。代码一提交两边同时编任何一边编译失败都会立刻暴露。CI脚本要做得和本地构建尽量一致。我在CI里固定用同样的CMake参数同样的生成器这样本地能复现的问题CI也能复现CI报出的错误本地也能快速重现。不要把平台相关路径写死在脚本里要使用环境变量或者相对路径。缓存策略也很重要第三方依赖源码一旦没变化就直接命中缓存不然每次构建都要重新编第三方库浪费时间还容易触发巧合同步问题。5. 常见问题与排查技巧实录5.1 构建期问题速查症状原因处理方案Windows链接时报lib文件找不到第三方库没有放到编译器搜索路径用CMake的find_package或显式target_link_libraries传入完整路径Linux编译报“visibility”相关错误宏定义在非GCC编译器环境中失效检查MYLIB_API宏定义保证在非Windows分支正确Windows下使用std::filesystem编译失败工具链版本过低或未明确C17标准升级工具链检查CMAKE_CXX_STANDARD头文件被重复包含且宏不一致平台相关宏在公共头文件里定义太晚把平台宏放到最前置的公共头文件采用include guard或#pragma once换行符混乱导致编译警告文件使用混合行尾在编辑器或git配置中统一行尾还有一个常见但隐蔽的问题是预编译头。MSVC对预编译头的处理方式和GCC/Clang完全不同跨平台项目如果强行用预编译头很容易出现“Windows编译快Linux却编不了”的情况。跨平台项目我建议先不上预编译头等代码稳定了再评估收益。5.2 运行期问题速查症状原因处理方案程序在Linux正常Windows启动即崩局部变量未初始化内存布局差异用调试器检查未初始化变量开启/RTC1或ASANWindows下中文路径读不到文件编码不一致或路径分隔符错误统一使用UTF-8内部编码使用std::filesystem::u8path动态库加载失败但dlopen/LoadLibrary调用成功依赖的符号不在导出表或依赖库顺序不对检查导出宏用ldd或系统自带依赖检查工具进程退出时崩溃全局对象析构顺序在两端不一致尽量避免非平凡的全局对象或使用单例初始化顺序控制Linux运行正常、Windows下浮点结果不同编译器浮点模型不同显式设置浮点行为如/fp:precise与-frounding-math对齐运行期问题里最让我头疼的是字符串编码。Linux默认UTF-8Windows系统API在宽字符和窄字符之间还有一层转换。在跨平台代码里内部尽量统一UTF-8字节流只在调用系统API的边界做转换。不要一会儿用std::string存中文一会儿直接传进Windows API很容易出现无法解释的乱码。5.3 我自己收藏的排查套路碰到跨平台bug我一般先问三个问题这是一个平台独有的问题还是两边行为不同这个差异是编译器造成的还是操作系统API造成的在代码里平台相关的分支是否已经收拢到一个文件这三个问题能很快定位方向。接着我会在两边同时打印关键变量的类型语义。固定位宽类型对齐、字节序转换是否做了打印出来立刻能看出问题。如果行为不一致我就把可疑代码抽到一个独立小Demo里在两边分别跑用最小复现环境去锁定范围。这个方法对排查“看起来随机”的难题特别有效因为最终你会发现很多随机崩溃根本不是随机而是未定义行为在不同平台上的不同表现。6. 最后再分享一个小技巧我在实际项目里最后还会做一步维护一份“平台行为对照笔记”。每次遇到一个跨平台差异哪怕当场解决了也把根因、复现方式、解决方案简短记下来。攒半年再回头看很多重复踩坑的路径会浮现出来再往后做新项目直接翻笔记就能避开一大半问题。跨平台开发没有银弹但把经验沉淀成团队共有的资产每次构建的试错成本就会明显下降。如果让我只说一条建议那就是别和高昂的试错成本对抗用工程化方式管理差异比在代码里打补丁靠谱得多。

相关新闻

SSH.NET 2023.1.0 升级连接失败的三大兼容性断层与修复

SSH.NET 2023.1.0 升级连接失败的三大兼容性断层与修复

简介:本资源为适配高安全级别Linux系统的C# SSH.NET最新稳定版类库,面向.NET平台开发者、系统运维工程师及需通过C#代码远程管理OpenEuler等现代Linux发行版的技术人员。针对旧版Renci.SshNet.dll因加密协议过时(如不支持OpenEuler 22.0.3默认…

2026/10/15 0:50:41 阅读更多 →
Flash停用后,如何用Ruffle和现代后端盘活老游戏服务器

Flash停用后,如何用Ruffle和现代后端盘活老游戏服务器

简介:这份资源围绕Flash游戏与配套服务器的通信实现展开,面向想理解网络游戏服务端架构、学习TCP编程与I/O多路复用的开发者,尤其适合具备一定C与网络基础、希望从实例入手的中级学习者。压缩包共15个文件,约649KB,以c…

2026/10/15 0:50:41 阅读更多 →
SQL 编辑器不是高级记事本:KStudio 与 KSQL Developer 里的建表与增删改查手法

SQL 编辑器不是高级记事本:KStudio 与 KSQL Developer 里的建表与增删改查手法

很多人对 SQL 编辑器的使用方式,停留在把它当成高级记事本:敲完语句、点一下执行、把结果复制走,补全、格式化、事务块、执行计划这些能力一概没碰。出了慢查询或误删数据,只能靠经验硬扛。 只靠「手写 执行」的常规做法为什么不…

2026/10/15 0:50:41 阅读更多 →

最新新闻

工业机器人坐标系全解析:从原理到标定实操

工业机器人坐标系全解析:从原理到标定实操

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

2026/10/15 1:36:03 阅读更多 →
Bugzilla部署报错couldn‘t create child process: 720002: index.cgi排查指南

Bugzilla部署报错couldn‘t create child process: 720002: index.cgi排查指南

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

2026/10/15 1:36:03 阅读更多 →
Matplotlib图例完全指南:legend()参数、位置与样式全解析

Matplotlib图例完全指南:legend()参数、位置与样式全解析

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

2026/10/15 1:36:03 阅读更多 →
单片机C运行时libspace:启动流程、多任务栈与中断安全实战

单片机C运行时libspace:启动流程、多任务栈与中断安全实战

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

2026/10/15 1:36:03 阅读更多 →
Spring BeanDefinitionRegistryPostProcessor底层注册机制详解

Spring BeanDefinitionRegistryPostProcessor底层注册机制详解

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

2026/10/15 1:36:03 阅读更多 →
CS5211单芯片eDP转LVDS方案:工业显示兼容性落地实践

CS5211单芯片eDP转LVDS方案:工业显示兼容性落地实践

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

2026/10/15 1:35:03 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →