来源 http://blog.csdn.net/aladdina/archive/2009/03/17/3999787.aspx
在Visual Studio中通过moc给Qt配置预编译头文件(Predefined Headers)
在Visual Studio中通过moc给Qt配置预编译头文件(Predefined Headers) 收藏
我创建Qt工程的方法是先用QCreator创建一个简单的程序,设计一些UI,然后用qmake把这个pro工程文件转成Visual Studio的vcproj工程文件。
这样的vcproj文件是没有使用预编译头的,当然可以很容易地的去Visual Studio中修改设置,这里我创建了一个名为pch.h的文件作为头文件。现在碰到的问题是,Qt使用moc来生成cpp文件并加入编译之中,比如你有一个mainwindow.h,然后moc会生成一个moc_mainwindow.cpp,如果这个cpp文件不引用指定的预编译头文件,则会出现这样的错误:
fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "pch.h"' to your source?
当然可以自己手动的将 #include "pch.h"加入该文件的前面,但是这个moc_mainwindow.cpp是动态生成的,在文件头部有一个很大的警告:WARNING! All changes made in this file will be lost!那如何让其自动加入pch.h呢?在网上查阅了一些英文的资料,居然没有人写。下面是我的方法:
我先进入命令行,然后用moc -help查看moc的帮助:
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
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
这样我就将 "-fpch.h" 放入mainwindow.h的custom build step设置的comman line参数中。但是原先的包含的mainwindow.h会被覆盖,这样我再加入-fmainwindow.h,问题解决。因此最终在moc后面加入的参数是 “-fpch.h -fmainwindow.h”。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/aladdina/archive/2009/03/17/3999787.aspx
http://blog.csdn.net/aladdina/archive/2009/04/30/4141050.aspx
在Qt Creator中给Qt配置预编译头文件(Predefined Headers)
前面写过一篇blog是关于如何 在Visual Studio中通过moc给Qt配置预编译头文件(Predefined Headers)
其实如果你能保证每次都通过修改Qt Creator的工程文件(.pro),然后通过Qmake转成Visual Studio的工程文件(.vcproj),那其实上面blog中提到的那种繁琐的方法是不需要的。修改Qt的工程项目文件,只需要将下面的code加入pro文件中即可:
# Use Precompiled headers (PCH)
PRECOMPILED_HEADER = stable.h
http://www.pin5i.com/showtopic-25976.html
Linux下编写Qt程序的详细步骤
前一段时间做过一个在Linux下编写的Qt程序,没来得及总结,现在总结一下Linux下开发的详细步骤。不过现在发现使用Eclipse或者 Qt Creator要比直接用VIM编程快捷多了,以后在学习Qt的过程中可能就不直接在Linux下编了,先在Winxp下编了再移植吧。
任务:在Redhat系统下创建和显示一个简单的窗口,使用标签显示字符串“Hello, Qt!”,在Redhat上调试通过后交叉编译下载至MagicARM2410上运行。
主要思想:标签是设计图形界面不可或缺的基本组件,利用标签我们可以显示各种信息。Qt为标签提供了一系列API函数,通过调用这些函数,可以很容易设计各种标签。调用Qt中标签的API函数,必须包含标签的头文件qlabel.h。如果需要显示的字符串信息很长,建议不要使用QLabel,改用其它部件如 MultiLineedit(多行编辑区)。
详细步骤
(1)进入/zylinux/x86-qtopia目录(Qt x86安装目录),运行set-env脚本,为本实验设置环境变量,然后创建文件夹hello。
1: $ cd /zylinux/x86-qtopia
2:
3: $ . set-env
4:
5: $ mkdir hello
(2)进入hello目录,新建文件hello.cpp,并编写程序,然后用progen工具生成工程文件hello.pro。
1: $ cd hello
2:
3: $ vi hello.cpp
4:
5: $ progen –t app.t –o hello.pro
(3)使用tmake工具,生成hello工程的Makefile文件。
$ tmake -o Makefile hello.pro
(4)修改Makefile文件,在LIBS变量中增加需要用到的库,然后输入make命令编译。
1: LIBS = $(SUBLIBS) -L$(QTDIR)/lib -lqte -lm -lstdc++
$ make
(5)启动虚拟控制台,运行hello程序(主机须启动帧缓冲,必须能够访问/dev/fb0)。
1: $ cd /zylinux/x86-qtopia
2: qvfb&
3: $ cd hello
4:
5: $ ./hello –qws
或者在终端,启动虚拟缓冲区和QPE,启动Qtopia的终端,输入./hello运行程序,亦可得到和图 6.1一样的结果。
$ cd /zylinux/x86-qtopia
$ . set-env
$ cd hello
$ qvfb&
$ ./hello
$ qpe
如果要将Hello程序发布到MagicARM2410上运行,还需进行以下工作:
(6)进入/zylinux/arm-qtopia目录(安装目录),并将hello工程复制到当前目录下。
$ cd /zylinux/arm-qtopia
$ cp –av /zylinux/x86-qtopia/hello .
(7)运行当前目录下的set-env文件,重新设置环境变量,进入hello目录,使用tmake工具,重新生成Makefile文件。
$ . set-env
$ cd hello
$ tmake -o Makefile hello.pro
(8)按照步骤(4)的方法修改包含库,编译,得到可执行文件hello,将hello文件添加到文件系统中,更新文件系统。
(9)插入USB鼠标和USB键盘,启动MagicARM2410。启动Qtopia的终端,运行hello程序。
注意事项:
(1)如果在PC中运行hello程序,出现某些库找不到,该如何处理?
提示:将所缺的库从/zylinux/x86-qtopia/qt/lib目录下复制到主机系统/usr/lib目录下即可。
(2)在ARM上运行时如果也出现类似问题,又该如何解决?
提示:将所缺的库从/zylinux/arm-qtopia/qt/lib目录下复制到目标系统/usr/lib目录下即可。
(3)使用自定义插槽:
Q_OBJECT
....
private slots:
void popupDialog();
tmake可以自动处理moc,如果出现undefined vtable,则用moc生成moc_hello.cpp,编译成moc_hello.o,最后一起连接即可。