<div class="htmledit_views">
<p>我创建Qt工程的方法是先用QCreator创建一个简单的程序,设计一些UI,然后用qmake把这个pro工程文件转成Visual Studio的vcproj工程文件。</p>
<p> </p>
<p>这样的vcproj文件是没有使用预编译头的,当然可以很容易地的去Visual Studio中修改设置,这里我创建了一个名为pch.h的文件作为头文件。现在碰到的问题是,Qt使用moc来生成cpp文件并加入编译之中,比如你有一个mainwindow.h,然后moc会生成一个moc_mainwindow.cpp,如果这个cpp文件不引用指定的预编译头文件,则会出现这样的错误:</p>
<p>fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "pch.h"' to your source?</p>
<p> </p>
<p>当然可以自己手动的将 #include "pch.h"加入该文件的前面,但是这个moc_mainwindow.cpp是动态生成的,在文件头部有一个很大的警告:WARNING! All changes made in this file will be lost!那如何让其自动加入pch.h呢?在网上查阅了一些英文的资料,居然没有人写。下面是我的方法:</p>
<p>我先进入命令行,然后用moc -help查看moc的帮助:</p>
<p><div class="dp-highlighter bg_xhtml"><div class="bar"><div class="tools"><b>[xhtml]</b> <a title="view plain" class="ViewSource" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;" href="#">view plain</a><span data-mod="popu_168"> <a title="copy" class="CopyToClipboard" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;" href="#">copy</a><div style="left: 514px; top: 650px; width: 16px; height: 16px; position: absolute; z-index: 99;"><embed name="ZeroClipboardMovie_1" width="16" height="16" align="middle" id="ZeroClipboardMovie_1" pluginspage="http://www.macromedia.com/go/getflashplayer" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" type="application/x-shockwave-flash" wmode="transparent" flashvars="id=1&width=16&height=16" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false"></div><div style="left: 514px; top: 650px; width: 16px; height: 16px; position: absolute; z-index: 99;"><embed name="ZeroClipboardMovie_2" width="16" height="16" align="middle" id="ZeroClipboardMovie_2" pluginspage="http://www.macromedia.com/go/getflashplayer" src="https://csdnimg.cn/public/highlighter/ZeroClipboard.swf" type="application/x-shockwave-flash" wmode="transparent" flashvars="id=2&width=16&height=16" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false"></div></span><span data-mod="popu_169"> <a title="print" class="PrintSource" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;" href="#">print</a></span><a title="?" class="About" onclick="dp.sh.Toolbar.Command('About',this);return false;" href="#">?</a></div></div><ol class="dp-xml"><li class="alt"><span><span>Usage: moc [options] </span><span class="tag"><</span><span class="tag-name">header-file</span><span class="tag">></span><span> </span></span></li><li><span> -o<span class="tag"><</span><span class="tag-name">file</span><span class="tag">></span><span> write output to file rather than stdout </span></span></li><li class="alt"><span> -I<span class="tag"><</span><span class="tag-name">dir</span><span class="tag">></span><span> add dir to the include path for header files </span></span></li><li><span> -E preprocess only; do not generate meta object code </span></li><li class="alt"><span> -D<span class="tag"><</span><span class="tag-name">macro</span><span class="tag">></span><span>[=</span><span class="tag"><</span><span class="tag-name">def</span><span class="tag">></span><span>] define macro, with optional definition </span></span></li><li><span> -U<span class="tag"><</span><span class="tag-name">macro</span><span class="tag">></span><span> undefine macro </span></span></li><li class="alt"><span> -i do not generate an #include statement </span></li><li><span> -p<span class="tag"><</span><span class="tag-name">path</span><span class="tag">></span><span> path prefix for included file </span></span></li><li class="alt"><span> -f[<span class="tag"><</span><span class="tag-name">file</span><span class="tag">></span><span>] force #include, optional file name </span></span></li><li><span> -nw do not display warnings </span></li><li class="alt"><span> @<span class="tag"><</span><span class="tag-name">file</span><span class="tag">></span><span> read additional options from file </span></span></li><li><span> -v display version of moc </span></li></ol></div><textarea name="code" class="xhtml" style="display: none;" rows="11" cols="70">Usage: moc [options] <header-file>
-o<file> write output to file rather than stdout
-I<dir> add dir to the include path for header files
-E preprocess only; do not generate meta object code
-D<macro>[=<def>] define macro, with optional definition
-U<macro> undefine macro
-i do not generate an #include statement
-p<path> path prefix for included file
-f[<file>] force #include, optional file name
-nw do not display warnings
@<file> read additional options from file
-v display version of moc</textarea></p>
<p>这样我就将 "-fpch.h" 放入mainwindow.h的custom build step设置的comman line参数中。但是原先的包含的mainwindow.h会被覆盖,这样我再加入-fmainwindow.h,问题解决。因此最终在moc后面加入的参数是 “-fpch.h -fmainwindow.h”。</p> </div>