QT预编译头文件

xiaoxiao2021-04-16  53

<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>

 

转载请注明原文地址: https://www.6miu.com/read-4818167.html

最新回复(0)