QT+VS無法編譯ui項目

平臺:VS2013 + QT 5.9.1
問題:新建一個解決方案"QtGuiApplication2",項目類型選擇“Qt GUI Application”,項目名"QtGuiApplication2",編譯成功;然後"解決方案"-添加-新建項目,項目類型同樣選擇“Qt GUI Application”,項目名"QtGuiApplication1",編譯後報錯:

error C1083: 無法打開包括文件: “ui_QtGuiApplication1.h”: No such file or directory

"QtGuiApplication1.ui"右鍵菜單"編譯"爲灰色,嘗試將該文件移除項目,重新加載,可以單個編譯,但項目編譯時報錯:

error LNK2001: 無法解析的外部符號 "public: virtual void * __cdecl QtGuiApplication1::qt_metacast(char const *)" (?qt_metacast@QtGuiApplication1@@UEAAPEAXPEBD@Z)	
error LNK2001: 無法解析的外部符號 "public: virtual struct QMetaObject const * __cdecl QtGuiApplication1::metaObject(void)const " (?metaObject@QtGuiApplication1@@UEBAPEBUQMetaObject@@XZ)	
error LNK2001: 無法解析的外部符號 "public: virtual int __cdecl QtGuiApplication1::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@QtGuiApplication1@@UEAAHW4Call@QMetaObject@@HPEAPEAX@Z)	

對比了QtGuiApplication1.vcxproj和QtGuiApplication2.vcxproj,發現QtGuiApplication1.vcxproj缺少了moc_xxx.cpp、xxx.qrc、ui_xxx.h、xxx.h、xxx.ui的配置項,分別按照QtGuiApplication2.vcxproj的配置好就可以成功編譯了
缺少的配置項(對照QtGuiApplication2.vcxproj)如下:
moc_xxx.cpp配置

    <ItemGroup>
    <ClCompile Include="GeneratedFiles\Debug\moc_QtGuiApplication2.cpp">
      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
    </ClCompile>
    <ClCompile Include="GeneratedFiles\qrc_QtGuiApplication2.cpp">
      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
      </PrecompiledHeader>
      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
      </PrecompiledHeader>
    </ClCompile>
    <ClCompile Include="GeneratedFiles\Release\moc_QtGuiApplication2.cpp">
      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
    </ClCompile>
    </ItemGroup>

xxx.h配置

   <ItemGroup>
   <CustomBuild Include="QtGuiApplication2.h">
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Moc%27ing QtGuiApplication2.h...</Message>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"  -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets"</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>
      <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Moc%27ing QtGuiApplication2.h...</Message>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>
      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(QTDIR)\bin\moc.exe"  "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp"  -DUNICODE -DWIN32 -DWIN64 -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB -DQT_WIDGETS_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets"</Command>
    </CustomBuild>
    </ItemGroup>

xxx.ui配置

   <ItemGroup>
    <CustomBuild Include="QtGuiApplication2.ui">
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\uic.exe;%(AdditionalInputs)</AdditionalInputs>
      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Uic%27ing %(Identity)...</Message>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\ui_%(Filename).h;%(Outputs)</Outputs>
      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(QTDIR)\bin\uic.exe;%(AdditionalInputs)</AdditionalInputs>
      <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Uic%27ing %(Identity)...</Message>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\ui_%(Filename).h;%(Outputs)</Outputs>
      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"</Command>
    </CustomBuild>
    </ItemGroup>

ui_xxx.h配置

<ItemGroup>
<ClInclude Include="GeneratedFiles\ui_QtGuiApplication2.h" />
</ItemGroup>

xxx.qrc配置

<ItemGroup>
    <CustomBuild Include="QtGuiApplication2.qrc">
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(FullPath);%(AdditionalInputs)</AdditionalInputs>
      <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Rcc%27ing %(Identity)...</Message>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">.\GeneratedFiles\qrc_%(Filename).cpp;%(Outputs)</Outputs>
      <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">"$(QTDIR)\bin\rcc.exe" -name "%(Filename)" -no-compress "%(FullPath)" -o .\GeneratedFiles\qrc_%(Filename).cpp</Command>
      <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(FullPath);%(AdditionalInputs)</AdditionalInputs>
      <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Rcc%27ing %(Identity)...</Message>
      <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">.\GeneratedFiles\qrc_%(Filename).cpp;%(Outputs)</Outputs>
      <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(QTDIR)\bin\rcc.exe" -name "%(Filename)" -no-compress "%(FullPath)" -o .\GeneratedFiles\qrc_%(Filename).cpp</Command>
    </CustomBuild>
  </ItemGroup>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章