2015-02-11 91 views
0

我使用Visual Studio與qt插件,當我建立我的項目時,它生成moc _ *。cpp文件作爲我的項目中的生成規則的結果:Qt Vs addin - .obj文件不生成moc _ *。cpp文件

<Tool 
Name="VCCustomBuildTool" 
Description="Moc&apos;ing $(InputFileName)..." 
CommandLine="$(QTDIR)\bin\moc.exe $(InputPath) -o .\GeneratedFiles\$(ConfigurationName)\moc_$(InputName).cpp (continues..) 
AdditionalDependencies="$(QTDIR)\bin\moc.exe;.\myfilewithqobject.h" 
Outputs=".\GeneratedFiles\$(ConfigurationName)\moc_myfilewithqobject.cpp"/> 

產生moc_myfilewithqobject.cpp後,繼續建設項目,並在鏈接階段它給LINK 2001年的錯誤:因爲它無法找到該文件moc_myfilewithobject.obj

unresolved external symbol "public: virtual struct QMetaObject const * __thiscall myfilewithobject::metaObject(void)const 
unresolved external symbol "public: virtual void * __thiscall myfilewithobject::qt_metacast(char const *) 
unresolved external symbol "public: virtual int __thiscall myfilewithobject::qt_metacall 

。 未生成moc_myfilewithobject.obj,因爲moc_myfilewithobject.cpp未在生成後編譯。 但是,當我將moc_myfilewithobject.cpp包含到我的項目中時,它將被編譯並解決問題。 但是這是手工完成的,它有時會導致一些問題。 有沒有辦法解決這個問題,而不包括moc_ .cpp文件手動投影? 就像編譯moc_ .cpp後生成或自動包括它?

說明: 我添加了一個試用.h文件作爲qt類,以查看在項目文件中添加新qt頭時會發生什麼情況。它補充說,不是我的問題的文件所擁有的線:

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

所以這是一個真正的配置,我認爲,但作爲一個Qt類不具有這樣的配置我的文件之前創建的。但是,當我刪除GeneratedFiles中的Debug文件夾時,它給出了相同的錯誤,因爲當我刪除Debug文件夾時,moc_ .cpp文件也從項目文件中刪除。 所以這裏是一個問題:生成的moc_ .cpp文件不能被刪除,這是真的嗎?

+0

通常情況下,如果你有Qt的VS插件正確安裝和你的項目定義爲一個Qt項目,增加了包含Q_OBJECT聲明的頭文件會自動將相應的moc _ *。cpp添加到項目的「生成的文件」文件夾中。也許你的項目應該轉換成Qt插件項目? – vahancho 2015-02-11 13:30:14

+0

沒有項目是一個Qt插件項目和moc _ *。cpp文件生成到生成文件文件夾中,在生成中沒有問題。生成的問題moc _ * .cpp文件未包含在項目中,因此未編譯,並且由於缺少obj文件而出現這些錯誤。 – 2015-02-11 13:36:21

+0

一般情況下,您需要將文件添加到項目中才能編譯該文件...使用qt將生成的moc文件添加到第一次創建的項目後是正常的。 – g19fanatic 2015-02-11 13:37:06

回答

0

在SLOUTION資源管理器,檢查

生成的文件

調試(或釋放出錯誤happans)

moc_[yourErrorFile].cpp 

右擊它看propertise

如果通用>從構建中排除爲真將其更改爲假

這是一種可能性會發生錯誤

0

@newdazhu是對某事。

我剛剛也遇到了類似的情況,一個項目中的一些但不是全部的類都有無法解析的成員函數。原來這是因爲一些丟失的目標文件(對於moc'ed類)。這些反過來並不是因爲它們被排除在當前配置的構建之外而建立的。

在我的情況下,它們被排除在構建調試和發佈配置。這通常是一個錯誤,除非所涉及的源文件最後包含moc _ *。cpp文件(這是一種在Qt內部經常使用的技術,因此您可以在源文件中包含例如信號/插槽)。在這種情況下,你實際上必須排除兩個/所有配置,否則你會得到一個多重定義的錯誤(moc _ *。cpp已經被編譯到另一個目標文件中)。

0

這是由於項目文件夾中的空間... 我的項目/

重命名到 我的項目/

這就是所有的人......

+0

問題中沒有名爲「我的項目」的文件夾。當OP說「我的項目」時,他們的字面意思就是他們的項目。 – Blastfurnace 2017-07-22 02:16:59