qmake 4.8.4自定义目标因大小写失效,如何规避?
解决qmake 4.8.4自定义目标的盘符大小写与路径依赖问题
这个问题的核心是qmake 4.8.4在处理Windows路径时会自动规范化盘符大小写和分隔符,而你手动替换路径的方式和qmake内部生成的路径格式不匹配,导致Makefile里的目标规则和依赖项对不上号。下面是针对性的解决方案:
核心思路
放弃手动替换路径分隔符,改用qmake内置的路径处理函数来统一路径格式和盘符大小写,确保自定义目标的路径和PRE_TARGETDEPS中的依赖路径完全一致,同时让生成的头文件依赖指向正确的输出目录。
修改后的.pro配置代码
win32 { # 使用qmake内置函数将路径转换为Windows系统格式,自动处理盘符大小写和分隔符 OUT_PWD_SYSTEM = $$system_path($$OUT_PWD) PWD_SYSTEM = $$system_path($$PWD) # 自定义目标的路径完全由qmake生成,确保和后续依赖匹配 autoversion.target = $$OUT_PWD_SYSTEM\\autoversioninfo.h autoversion.depends = FORCE # 命令中的路径同样用系统格式,避免和qmake生成的路径出现格式差异 autoversion.commands = $$PWD_SYSTEM/../../AutoBuildVersion.exe $$PWD_SYSTEM $$OUT_PWD_SYSTEM QMAKE_EXTRA_TARGETS += autoversion # 直接引用自定义目标的target变量,避免手动拼接出错 PRE_TARGETDEPS += $$autoversion.target }
关键细节解释
$$system_path()函数:这个函数会把qmake内部使用的Unix风格路径(/分隔)转换成当前系统的路径格式(Windows下是\分隔),同时qmake会自动统一盘符的大小写(比如把d:\转换成和系统规范一致的D:\),这样生成的Makefile里目标规则和依赖项的路径就完全匹配了,不会再出现大小写不匹配的问题。- 直接引用
$$autoversion.target:避免手动重复写路径,减少拼写错误的可能,确保PRE_TARGETDEPS里的依赖路径和自定义目标的路径完全一致。 - FORCE依赖:确保每次构建都会执行
AutoBuildVersion.exe,不管autoversioninfo.h是否存在,符合自动版本号生成的需求。
为什么之前的方案失效?
- 手动替换
/为\时,qmake在生成DESTDIR_TARGET等变量时会自动规范化路径,导致你的自定义目标路径(比如d:\xxx)和qmake生成的依赖路径(比如D:/xxx)大小写/格式不匹配,Make会认为目标未被创建。 - 移除完整路径后,qmake会默认把生成的头文件依赖指向源目录,而不是输出目录,导致编译时找不到生成的
autoversioninfo.h。
内容的提问来源于stack exchange,提问作者user526477
相关产品推荐
相关产品推荐

