改变QtVarsOutputDir输出位置
2024-03-17 17:33:41

在VS中编译Qt项目,总是会在工程目录下创建x64\Debug\qmake\qtvars_x64_Debug.props文件。
研究一番后发现,Qt工程会引入属性表文件Qt.props,位置在C:\Users\{用户名}\AppData\Local\QtMsBuild目录下
内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!--
/////////////////////////////////////////////////////////////////////////////////////////////////
// Import private Qt property definitions
// -->
<ImportGroup Label="Qt">
<Import Project="$(MSBuildThisFileDirectory)\qt_private.props" />
</ImportGroup>
<!--
/////////////////////////////////////////////////////////////////////////////////////////////////
// User-defined settings
// -->
<PropertyGroup Label="UserMacros">
<!-- Placeholder for user macros written by VS Property Manager -->
</PropertyGroup>
<PropertyGroup>
<!-- Placeholder for properties written by VS Property Manager -->
</PropertyGroup>
<ItemDefinitionGroup>
<!-- Placeholder for default metadata written by VS Property Manager -->
</ItemDefinitionGroup>
<ItemGroup>
<!-- Placeholder for items written by VS Property Manager -->
</ItemGroup>
</Project>

它又导入了qt_private.props文件,其中包含这么一段

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<PropertyGroup Condition="'$(QtVsProjectSettings)' == 'true'">

<!--// Path to Qt variables property file -->
<QtVarsOutputDir Condition="'$(QtVarsOutputDir)' == ''"
>$([System.IO.Path]::Combine('$(ProjectDir)', '$(IntDir)', 'qmake'))</QtVarsOutputDir>
<QtVarsFileName Condition="'$(QtVarsFileName)' == ''"
>qtvars_$(Platform.Replace(' ','_'))_$(Configuration.Replace(' ','_')).props</QtVarsFileName>
<QtVarsFilePath Condition="'$(QtVarsFilePath)' == ''"
>$(QtVarsOutputDir)\$(QtVarsFileName)</QtVarsFilePath>

<!--// Path to temp work folder -->
<QtVarsWorkDirName
>temp</QtVarsWorkDirName>
<QtVarsWorkDir
>$([System.IO.Path]::Combine('$(QtVarsOutputDir)','$(QtVarsWorkDirName)'))</QtVarsWorkDir>
<QtVarsWorkPath
>$(QtVarsWorkDir)\$(QtVarsFileName)</QtVarsWorkPath>
<QtVarsIndexPathDesignTime
>$(QtVarsWorkDir)\$(ProjectGuid.Replace('{','').Replace('}','')).$(ProjectName).designtime.idx</QtVarsIndexPathDesignTime>
<QtVarsDesignTime Condition="Exists('$(QtVarsIndexPathDesignTime)')"
>$([System.String]::Copy($([System.IO.File]::ReadAllText('$(QtVarsIndexPathDesignTime)'))).Replace('&#xD;&#xA;','')) </QtVarsDesignTime>
</PropertyGroup>

其中QtVarsOutputDir就是这个目录的输出位置,这里用 Path.Combine 合并成了最终路径,其中内置宏 $(IntDir) 指向的是中间目录

也就是说qmake的相关临时文件应该输出到中间目录,可是在修改了中间目录后并没有起到效果,相关的临时文件还是输出到x64\Debug\qmake目录下了,猜测在编译工程时的$(IntDir)变量仍然是默认值,修改后的值并没有被采用。

折腾一番后终于发现了原因所在:顺序问题!当在VS界面中修改中间目录后,在工程文件中会多出这样一段

1
2
3
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<IntDir>_obj\$(Configuration)\</IntDir>
</PropertyGroup>

再往上翻一点肯定可以看到这个

1
2
3
4
5
6
7
8
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="$(QtMsBuild)\Qt.props" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)' == 'Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
<Import Project="$(QtMsBuild)\Qt.props" />
</ImportGroup>

原因就是在导入Qt.props时,IntDir还未被解析
所以解决方法有两种:

  1. 在导入Qt.props之前设置QtVarsOutputDir,这样qt_private.props文件中的Condition将会为false
  2. <IntDir>移动至Qt属性表导入之前,或者干脆就放在QtSettings
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug|x64'" Label="QtSettings">
    <QtInstall>Qt6</QtInstall>
    <QtModules>core;gui;widgets</QtModules>
    <QtBuildConfig>debug</QtBuildConfig>
    <IntDir>_obj\$(Configuration)\</IntDir>
    </PropertyGroup>
    <PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release|x64'" Label="QtSettings">
    <QtInstall>Qt6</QtInstall>
    <QtModules>core;gui;widgets</QtModules>
    <QtBuildConfig>release</QtBuildConfig>
    <IntDir>_obj\$(Configuration)\</IntDir>
    </PropertyGroup>
    如果DebugRelease的值是相同的话,也可以放在Globals
    1
    2
    3
    <PropertyGroup Label="Globals">
    <IntDir>_obj\$(Configuration)\</IntDir>
    </PropertyGroup>

相关阅读

QtVarsOutputDir cannot be changed

上一页
2024-03-17 17:33:41
下一页