我的.pro文件里面有额外的东西:
win32 {
OUT_PWD_SHELL = $$replace(OUT_PWD, /, \)
autoversion.target = $$OUT_PWD\autoversioninfo.h
autoversion.depends = FORCE
autoversion.commands = $$PWD/../../AutoBuildVersion.exe $$replace(PWD, /, \) $$OUT_PWD_SHELL
QMAKE_EXTRA_TARGETS += autoversion
PRE_TARGETDEPS += $$OUT_PWD\autoversioninfo.h
}
这无法按预期工作,因为在生成的 makefile DESTDIR_TARGET
中添加了一个新的依赖项,该依赖项以 d:
开头,但为自动版本生成的规则以 D:/
开头。我可以通过将所有/
替换为来稍微改善这一点,但区分大小写仍然会破坏它并且没有构建目标。
如果我从autoversion.target
中删除完整路径并PRE_TARGETDEPS
那么它解决了这个问题,但是在计算依赖项时,包含生成的标头的cpp
文件的规则会发生变化,以提供依赖项中标头的显式路径,并且该路径指向源目录,而不是生成生成文件的输出目录。这会导致 make 到 barf 并且不生成生成的文件。
我不知道为什么qmake会改变驱动器的大小写处理,这很烦人,但是我如何让这一切正常工作?
没有好的解决方案。我想出的最好的方法是使用始终运行的虚假目标来生成头文件。不利的一面是,当头文件已经存在时,这会减慢构建速度,但从好的方面来说,它允许构建完成。
win32 {
OUT_PWD_SHELL = $$replace(OUT_PWD, /, \)
gen_autoversion.target = GENERATE_AUTOVERSIONINFO
gen_autoversion.commands = $$PWD/../../AutoBuildVersion.exe $$replace(PWD, /, \) $$OUT_PWD_SHELL
QMAKE_EXTRA_TARGETS += gen_autoversion
PRE_TARGETDEPS += GENERATE_AUTOVERSIONINFO
}
我不确定这里是否真的需要PRE_TARGETDEPS。