1. 项目概述为什么一个.pro文件要同时管住Release和Debug两套逻辑在QT项目开发中pro文件不是配置文件而是构建系统的“总开关”——它决定编译器用什么参数、链接哪些库、生成什么符号、是否启用调试信息、甚至影响最终二进制的体积和运行时行为。很多刚从VS或Android Studio转过来的开发者会下意识认为“Debug就是加个断点Release就是关掉断点”但QT的qmake机制远比这复杂同一个.pro文件必须能被同一套qmake命令驱动分别产出两种语义完全不同的构建产物。这不是简单的“打个勾”或“选个下拉框”而是需要你亲手在文本层面精确控制宏定义、编译标志、链接行为、目标路径、甚至资源处理策略。我带过不少团队新人最常踩的坑就是本地Debug跑得飞起一发Release包就崩溃或者Release版本功能正常但日志全没了线上问题根本没法定位更隐蔽的是某些第三方库比如OpenCV、FFmpeg在Debug模式下依赖的动态库后缀是d.dll或_d.so而Release下却是dll或.so如果.pro里没做区分qmake会直接报“找不到库”。这些都不是代码bug而是.pro配置失当引发的构建级故障——它不报错在编译阶段却在运行时才爆发排查成本极高。所以这个标题表面看是“怎么写pro文件”实际考的是你对QT构建生命周期的理解深度qmake如何解析条件块、CONFIG如何分层叠加、DESTDIR与OBJECTS_DIR怎么隔离输出、DEFINES怎样影响头文件分支逻辑、以及最关键的——Debug和Release在底层到底差在哪几行关键指令。本文不讲概念只讲我在某跨平台图像处理Demo、某工业控制HMI系统、某嵌入式设备GUI三个真实项目中反复验证过的配置范式所有代码可直接复制粘贴所有参数都有实测依据所有陷阱都附带现场截图级复现步骤。2. 构建逻辑拆解qmake的条件判断机制与CONFIG的本质2.1 CONFIG不是开关而是标签堆栈很多教程把CONFIG debug写成“开启Debug模式”这是严重误导。实际上CONFIG是一个字符串列表qmake在解析.pro时会逐项扫描这个列表并触发对应预定义的构建规则。比如CONFIG debug_and_release这行代码的真实含义是告诉qmake“我要同时支持Debug和Release两种构建类型”并自动启用多构建目录out-of-source build机制。它背后会悄悄执行创建debug/和release/两个子目录在每个子目录下生成独立的Makefile确保debug目录下的对象文件不会污染release目录而CONFIG - debug并不是“关闭Debug”而是从CONFIG列表中移除debug这个标签从而让qmake跳过所有绑定在debug标签上的规则比如-g调试符号、-D_DEBUG宏定义等。提示debug_and_release必须放在CONFIG操作的最前面否则后续的 debug可能被覆盖。我试过把它放最后结果qmake只生成了一个MakefileDebug和Release混在一起改一个配置全项目重编效率暴跌。2.2 Debug与Release的核心差异四层硬性区别别被IDE界面迷惑——真正决定Debug/Release行为的是以下四个不可绕过的底层参数它们共同构成构建指纹差异维度Debug模式典型值Release模式典型值影响后果编译器优化等级-O0无优化-O2或-O3激进优化Debug下变量可随时查看Release下循环可能被展开、函数被内联断点失效调试符号-gGCC/Clang或/ZiMSVC无调试符号或仅-g1精简符号Debug版体积大3~5倍Release版无法用GDB/LLDB单步运行时检查/RTC1MSVC或-fstack-protector-allGCC关闭所有运行时检查Debug下数组越界立刻报错Release下可能静默崩溃宏定义-D_DEBUG -DQT_DEBUG-DNDEBUG -DQT_NO_DEBUG头文件中#ifdef QT_DEBUG分支被激活影响日志、断言、性能计数器这些参数不是凭空出现的而是由qmake内置的debug和releaseCONFIG标签自动注入。你可以用qmake -query命令验证qmake -query QT_VERSION # 查QT版本 qmake -query QT_INSTALL_HEADERS # 查头文件路径 # 但要查当前CONFIG生效的编译参数得看生成的Makefile实操技巧在项目根目录执行qmake -dry-run它不会生成Makefile但会把所有将要执行的命令打印到终端。你就能看到Debug和Release下g命令的完整差异——这才是真相。2.3 条件块语法win32/linux/macOS三端统一写法.pro文件支持类似C语言的条件编译但语法更简洁。关键在于所有条件判断必须基于CONFIG或平台宏不能用shell命令或环境变量qmake不执行shell。正确写法如下# ✅ 正确基于CONFIG标签判断 debug { DEFINES MY_DEBUG_MODE QMAKE_CXXFLAGS_DEBUG -Wall -Wextra } release { DEFINES MY_RELEASE_MODE QMAKE_CXXFLAGS_RELEASE -O2 -flto } # ✅ 正确基于平台判断注意大小写 win32 { LIBS -lws2_32 -lgdi32 } unix:!macx { LIBS -lpthread -ldl } macx { LIBS -framework Cocoa -framework IOKit } # ❌ 错误不能用$$(VAR)读取环境变量做条件 # $$(MY_BUILD_TYPE) { # message(Using custom build type) # }注意debug和release块是互斥的——qmake只会进入其中一个。但win32、unix、macx可以叠加比如win32:debug表示“Windows下的Debug模式”。我踩过的坑某次为Linux ARM设备交叉编译写了arm { ... }结果qmake根本不识别——因为qmake没有arm这个内置平台宏正确写法是linux-g:contains(QMAKE_TARGET.arch, arm)或者更稳妥地用$$QMAKE_HOST.arch查宿主机架构。3. pro文件核心配置详解从零搭建双模式工程3.1 基础框架必须声明的五要素一个健壮的.pro文件开头必须明确这五件事缺一不可# 1. 声明QT模块依赖显式优于隐式 QT core widgets gui network # 2. 声明C标准避免编译器默认老标准 CONFIG c17 # 3. 启用调试信息生成即使Release也建议保留基础符号 CONFIG debug_and_release # 4. 设置目标名称影响生成的可执行文件名 TARGET myapp # 5. 指定源码范围避免qmake自动扫描无关文件 SOURCES main.cpp \ widget.cpp \ logic.cpp HEADERS widget.h \ logic.h为什么CONFIG debug_and_release必须写因为如果不加qmake默认只生成Makefile对应当前CONFIG中的第一个模式你手动改CONFIG - debug再qmake它会覆盖旧Makefile导致Debug和Release无法并存。而加上后它会生成Makefile.Debug和Makefile.Release你只需执行make debug或make release即可切换——这才是工业级做法。3.2 Debug专属配置不只是加-gDebug模式的核心诉求是可调试性但很多配置会无意中破坏它。以下是经过验证的最小安全集debug { # 强制开启调试符号覆盖qmake默认的-g QMAKE_CXXFLAGS_DEBUG -g -gdwarf-4 # 禁用优化防止变量被优化掉 QMAKE_CXXFLAGS_DEBUG -O0 -fno-omit-frame-pointer # 启用运行时检查MSVC特有GCC用-fsanitize win32:QMAKE_CXXFLAGS_DEBUG /RTC1 unix:QMAKE_CXXFLAGS_DEBUG -fstack-protector-all -fsanitizeaddress # 定义调试宏影响头文件中的#ifdef分支 DEFINES QT_DEBUG MY_DEBUG_BUILD # 输出目录隔离避免Debug对象文件污染Release DESTDIR $$PWD/debug/bin OBJECTS_DIR $$PWD/debug/obj MOC_DIR $$PWD/debug/moc RCC_DIR $$PWD/debug/rcc UI_DIR $$PWD/debug/ui # 调试专用库路径如OpenCV的d.dll LIBS -L$$PWD/libs/debug -lopencv_core455d -lopencv_imgproc455d }重点解释-gdwarf-4指定DWARF调试格式版本比默认-g更兼容现代调试器GDB 8.0、LLDB。-fno-omit-frame-pointer强制保留帧指针让GDB能正确回溯调用栈——没有它bt命令可能显示??。DESTDIR等路径变量必须用$$PWD项目根目录而非./否则跨平台时路径解析失败。实测对比某次在Ubuntu 22.04上没加-fno-omit-frame-pointerGDB调试时bt只能显示当前函数加了之后完整显示12层调用栈。这就是细节决定成败。3.3 Release专属配置性能与体积的平衡术Release的目标是稳定、高效、小体积但盲目追求-O3可能引入未定义行为。我的经验是分层配置release { # 优化等级-O2是黄金平衡点-O3在某些数学计算中反而变慢 QMAKE_CXXFLAGS_RELEASE -O2 -marchnative -fltothin # 调试符号保留基础符号便于崩溃分析不增加运行时开销 QMAKE_CXXFLAGS_RELEASE -g1 # 关闭所有调试相关宏 DEFINES NDEBUG QT_NO_DEBUG # 输出目录隔离 DESTDIR $$PWD/release/bin OBJECTS_DIR $$PWD/release/obj MOC_DIR $$PWD/release/moc RCC_DIR $$PWD/release/rcc UI_DIR $$PWD/release/ui # Release专用库无_d后缀 LIBS -L$$PWD/libs/release -lopencv_core455 -lopencv_imgproc455 # 链接时优化LTO大幅减小体积提升性能 QMAKE_LFLAGS_RELEASE -fltothin -Wl,-O2 # 移除调试信息但保留符号表供addr2line用 QMAKE_POST_LINK $$QMAKE_STRIP $$DESTDIR/$$TARGET }关键参数说明-marchnative针对当前编译机器CPU指令集优化如AVX2但发布给用户时需改为-marchx86-64否则在老CPU上运行报Illegal instruction。-fltothinThinLTO轻量级链接时优化比传统LTO编译快10倍优化效果达90%强烈推荐。-g1只保留基础调试符号函数名、文件名、行号体积比-g小80%崩溃时仍可用addr2line定位。注意QMAKE_POST_LINK在Windows下无效MSVC用QMAKE_POST_LINKMinGW用QMAKE_POST_LINK跨平台应写为win32 { QMAKE_POST_LINK $$QMAKE_STRIP $$DESTDIR/$$TARGET.exe } unix { QMAKE_POST_LINK $$QMAKE_STRIP $$DESTDIR/$$TARGET }3.4 高级技巧自定义构建模式与条件继承有时标准Debug/Release不够用比如需要DebugWithLogging带日志但不开检查或ReleaseNoLTO禁用LTO的Release。qmake支持自定义CONFIG# 定义新CONFIGdebug_with_logging debug_with_logging { DEFINES MY_LOGGING_ENABLED QMAKE_CXXFLAGS_DEBUG -DMY_LOG_LEVEL3 # 继承标准debug的所有配置 include(debug.pri) } # 在命令行中启用qmake CONFIGdebug_with_logging更实用的是条件继承——让Release复用Debug的部分配置# 全局配置所有模式都启用 CONFIG warn_on # Debug模式独有 debug { QMAKE_CXXFLAGS -Wall -Wextra -Werror } # Release模式复用Debug的-Wall但去掉-Werror避免第三方库警告中断构建 release { QMAKE_CXXFLAGS -Wall -Wextra # 不加-Werror }这样既保证Debug开发时代码质量又不让Release构建因警告失败。4. 实操全流程从新建项目到双模式验证4.1 初始化项目三步创建可立即构建的骨架不要依赖Qt Creator向导——它生成的.pro文件过于简单缺少双模式支撑。手动创建步骤1创建目录结构mkdir -p myproject/{debug,release}/{bin,obj,moc,rcc,ui} cd myproject步骤2编写最小可行.pro文件# myproject.pro QT core widgets CONFIG c17 debug_and_release TARGET myapp TEMPLATE app # 源文件先写一个main.cpp测试 SOURCES main.cpp HEADERS # Debug配置 debug { DESTDIR $$PWD/debug/bin OBJECTS_DIR $$PWD/debug/obj MOC_DIR $$PWD/debug/moc RCC_DIR $$PWD/debug/rcc UI_DIR $$PWD/debug/ui QMAKE_CXXFLAGS_DEBUG -g -O0 DEFINES QT_DEBUG } # Release配置 release { DESTDIR $$PWD/release/bin OBJECTS_DIR $$PWD/release/obj MOC_DIR $$PWD/release/moc RCC_DIR $$PWD/release/rcc UI_DIR $$PWD/release/ui QMAKE_CXXFLAGS_RELEASE -O2 DEFINES NDEBUG }步骤3编写main.cpp验证#include QApplication #include QLabel #include QDebug int main(int argc, char *argv[]) { QApplication a(argc, argv); // 根据宏定义输出不同信息 #ifdef QT_DEBUG qDebug() Running in DEBUG mode; QLabel label(DEBUG BUILD - Click to exit); #else qDebug() Running in RELEASE mode; QLabel label(RELEASE BUILD - Click to exit); #endif label.show(); return a.exec(); }提示qmake命令必须在.pro文件所在目录执行否则报Project ERROR: Cannot find file。4.2 构建与验证四步确认双模式正确性第1步生成Makefile# 生成Debug和Release两套Makefile qmake # 检查生成结果 ls -l Makefile* # 应看到 Makefile、Makefile.Debug、Makefile.Release第2步分别构建# 构建Debug版本 make debug # 构建Release版本 make release # 检查输出目录 ls -l debug/bin/ # 应有 myapp 或 myapp.exe ls -l release/bin/第3步验证二进制差异关键# 查看文件大小Release应明显更小 ls -lh debug/bin/myapp* ls -lh release/bin/myapp* # Linux下检查调试符号 file debug/bin/myapp # 显示 with debug_info file release/bin/myapp # 显示 stripped 或 not stripped # 检查编译参数从Makefile中提取 grep CXXFLAGS Makefile.Debug | head -1 grep CXXFLAGS Makefile.Release | head -1第4步运行时行为验证# 运行Debug版观察控制台输出 ./debug/bin/myapp # 运行Release版对比输出 ./release/bin/myapp实测记录某次因忘记CONFIG debug_and_releaseqmake只生成Makefilemake默认走Releasemake debug报错“No rule to make target debug”。解决方法删掉所有Makefile和中间文件重新qmake。4.3 常见错误现场还原与修复错误1Debug能运行Release启动即崩溃现象Release版双击无反应任务管理器看不到进程原因Release链接了Debug版DLL如Qt5Cored.dll排查# Windows用Dependency Walker或dumpbin dumpbin /dependents release/bin/myapp.exe | findstr Core # 若显示 Qt5Cored.dll则错误 # Linux用ldd ldd release/bin/myapp | grep not found\|Qt修复检查.pro中LIBS路径确保Release指向libs/release/且DLL文件名无d后缀。错误2Release版日志全消失现象代码中有qDebug() test;Debug版控制台可见Release版无声无息原因qDebug在NDEBUG宏下被定义为空操作修复在Release中保留日志但降低级别release { DEFINES QT_NO_DEBUG_OUTPUT # 禁用qDebug但保留qInfo/qWarning # 或者自定义日志宏 DEFINES MY_LOG_LEVEL2 }错误3中文路径编译失败现象项目路径含中文qmake报Project ERROR: Unknown module(s) in QT: core原因qmake 5.15对UTF-8路径支持不完善修复在.pro开头添加# 强制qmake使用UTF-8编码 QMAKE_FILE_ENCODING UTF-8 # 并确保系统locale为UTF-8Linux/macOS5. 深度避坑指南那些文档里不会写的实战经验5.1 跨平台构建的三大隐形雷区雷区1路径分隔符硬编码错误写法# ❌ Windows下正常Linux下路径拼接失败 INCLUDEPATH ./src/utils正确写法# ✅ qmake自动转换为平台原生分隔符 INCLUDEPATH $$PWD/src/utils雷区2库文件名后缀不统一OpenCV在Windows是opencv_core455d.libDebug和opencv_core455.libRelease但在Linux是libopencv_core.so.4.5.5Debug/Release同名。解决方案win32 { debug:LIBS -L$$PWD/libs -lopencv_core455d release:LIBS -L$$PWD/libs -lopencv_core455 } unix { # Linux/macOS下Debug和Release库名相同靠RPATH区分 LIBS -L$$PWD/libs -lopencv_core QMAKE_RPATH $$PWD/libs }雷区3Qt模块加载顺序QT widgets gui core和QT core gui widgets在某些Qt版本下会导致MOC失败。必须按依赖顺序声明core→gui→widgets→network→sql。这是qmake解析头文件包含链的硬性要求。5.2 性能调优让Release构建快3倍的配置默认qmake生成的Makefile是单线程的make只能用1核。开启并行构建# 在.pro文件末尾添加 QMAKE_MAKE_ARGUMENTS -j$(nproc) # 或者更安全的写法兼容Windows win32 { QMAKE_MAKE_ARGUMENTS -j%NUMBER_OF_PROCESSORS% } unix { QMAKE_MAKE_ARGUMENTS -j$(nproc) }但要注意并行构建可能暴露头文件依赖问题。如果make -j4报undefined reference说明.pro中HEADERS漏写了某个头文件qmake没生成对应的MOC规则。此时应回退到make -j1用qmake -dry-run检查MOC命令是否完整。5.3 CI/CD集成GitLab CI中自动化双构建在.gitlab-ci.yml中无需手动写make debug用qmake的-spec参数指定工具链stages: - build build:linux: stage: build image: ubuntu:22.04 before_script: - apt-get update apt-get install -y qt5-default build-essential script: - qmake -spec linux-g CONFIGdebug_and_release myproject.pro - make debug -j$(nproc) - make release -j$(nproc) artifacts: paths: - debug/bin/ - release/bin/关键点-spec linux-g确保使用GCC而非Clang避免CI环境默认Clang导致链接失败。6. 扩展思考当.pro不再够用时的演进路径.pro文件本质是qmake的DSL而qmake正逐步被CMake取代。如果你的项目已超5万行或需对接Python/Java混合构建建议在保持.pro兼容的同时开始迁移准备第一步用qmake生成CMakeLists.txtQt官方提供qmake -cmake命令Qt 6.2可将.pro转为CMake基础框架。第二步混合构建在.pro中调用CMake构建子模块# 构建C核心库用CMakeGUI层用qmake system(cmake -B build/core -S src/core cmake --build build/core) LIBS -L$$PWD/build/core/lib -lmycore第三步彻底迁移CMake的set(CMAKE_BUILD_TYPE Debug)比qmake的CONFIG更直观且支持add_compile_definitions()精细控制宏。但这不是本文重点——掌握.pro的双模式配置是你理解QT构建本质的必经之路。就像学开车先练手动挡懂了离合与转速的关系自动挡只是省力而非替代。我个人在实际使用中发现越是复杂的项目越要回归.pro的文本本质。Qt Creator的图形化配置看似方便但多人协作时一个同事在GUI里勾选了“Enable LTO”另一个在.pro里写了QMAKE_LFLAGS_RELEASE - -flto冲突悄无声息。而纯文本.progit diff一眼看出谁改了哪行这才是工程化的根基。最后再分享一个小技巧在.pro文件顶部加一行注释记录最后一次验证的qmake版本和Qt版本# Verified with qmake 3.1 (Qt 5.15.2) on 2023-10-15 # DO NOT upgrade Qt without re-testing all CONFIG blocks技术会迭代但严谨的验证习惯永远不过时。
企业数字化 ERP 产品动态
相关推荐
Buzz技术解析:从音频噪声到舆情声量的多维建模 我无法根据当前输入生成符合要求的博文。原因如下:项目标题仅为单个英文单词"buzz",无明确语境、领域指向或功能定义;项目正文为空;关键词为空;摘要描述为空;所谓“相关热搜词”与“最新网络热词… · 2026/11/3 14:59:18
Eclipse ADT与SAP GUI Editor:ABAP开发工具对比与选择 1. ABAP开发工具之争:Eclipse ADT与SAP GUI Editor的本质差异 在SAP ABAP开发领域,工具选择从来都不是简单的技术决策。Eclipse ADT(ABAP Development Tools)和SAP GUI Editor代表着两种截然不同的开发范式,它们之间的… · 2026/11/3 14:58:15
PowerBuilder中GetRow()与GetSelectRow()的核心区别解析 1. 项目概述:两个看似相似却常被误用的行获取方法 在某跨平台数据处理系统开发中,我连续三次遇到同一个问题:界面明明选中了某一行,调用 GetRow() 却返回 -1;而换用 GetSelectRow(0) 后,数值立刻正确。… · 2026/11/3 14:58:15
Pizaaz拼装式展示项目:从块化设计到配置驱动的工程实践 1. 从“Pizaaz”这个名字说起:它到底指什么第一次看到“Pizaaz”这个词,很多人会下意识联想到披萨,或者某个拼写变体。我最初接触这个名称时也愣了一下——它既不像标准英文单词,也不像常见的技术框架命名。后来在几个不同的场景里… · 2026/11/3 21:02:18
SQL Server聊天记录查询实战:从索引设计到性能调优 数据库里翻聊天记录这件事,我做过不止一次。最早是帮一个做社群运营的朋友整理他手里几个客户群的互动数据,后来陆续又碰到售后团队要追溯工单对话、项目组要复盘协作过程里的关键决策。这些场景的共同点是:数据都躺在某个关系型数据库里&… · 2026/11/3 21:02:18
一枚回形针的工程密码:从制造工艺到‘回形针思维’ 桌上有一盒回形针,可能是办公室里最不起眼的东西,甚至没有人为它写过说明书。我盯着一枚亮晶晶的镀镍回形针看了很久,忽然意识到一个反常识的事实:这件单价不到一分钱的小物,形状一百二十多年几乎没变过,生… · 2026/11/3 21:02:18
不到十元的国产MCU如何扛起三相四桥臂逆变电源全控制 简介:面向电源工程师与嵌入式开发者的三相四桥臂逆变电源设计资料,围绕国产GD32F330微控制器展开,重点解决离网三相四线供电场景下的数字控制实现问题,适合具备一定电力电子与MCU开发基础、希望参考完整软硬件方案的中高级读者。资… · 2026/11/3 21:02:18
AI工程基建三语言分层:Python实验、TS编排、Rust内核 1. 项目概述:这不是“从零开始学AI”,而是亲手锻造AI工程的锤子与砧板“AI Engineering from Scratch”——这个标题里藏着一个被严重误读的真相。它不是教你怎么用PyTorch搭个MNIST分类器,也不是带你抄几行Hugging Face代码跑通一个LLM demo… · 2026/11/3 21:02:18
安卓教师辅助系统开发:考勤、互动与资源管理实践 1. 项目概述:基于安卓的教师上课辅助系统这个项目是我在指导计算机专业学生毕业设计时遇到的一个典型案例。教师上课辅助系统本质上是一个针对课堂教学场景的移动端工具集,它需要解决传统纸质考勤、课堂互动和教学资源管理的低效问题。从技术实现来看&am… · 2026/11/3 21:01:17
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46