镜缘浮影 小人本住在 苏州的城外 家里有屋又有田 生活乐无边

QT(一).hello world

2017-02-23
wilmosfang
qt
 
原文地址 http://soft.dog/2017/02/23/qt-basic-01/

前言

Qt 是一个著名的 C++ 应用程序框架

本质上来讲,Qt 是一套 C++ 的代码库(类库)与工具集,与开发人员的关系就像军火库对于军人的关系一样,也好比预制构件库对于建筑工程师的关系一样,可以提供各种现成的组件来高效便捷地实现 C++ 应用

Tip: 虽然 Qt 常被用来开发图形界面应用,但它并不仅仅局限于 GUI 应用

Qt 是一个跨平台的框架

Qt is a cross-platform application development framework for desktop, embedded and mobile. Supported Platforms include Linux, OS X, Windows, VxWorks, QNX, Android, iOS, BlackBerry, Sailfish OS and others.

一般有三种策略实现跨平台GUI :

  • API 映射:界面库使用同一套 API,将其映射到不同的底层平台上面
  • API 模拟:API 映射会“缺失”不同平台的特定功能,而 API 模拟可以解决这一问题,不同平台上有差异的 API,使用工具库自己的代码模拟出来
  • GUI 模拟:任何平台都提供了图形绘制函数,例如画点、画线、画面等,工具库利用这些基本函数,再绘制出自己的组件,这就是 GUI 模拟

所以可想而知,同一套 Qt 代码在不同平台上生成的应用,界面风格将会迥异(随平台而定)

QtC++ 编程思想的集大成者,从中可以习得很多优秀的编程最佳实践

Qt is not a programming language on its own. It is a framework written in C++. A preprocessor, the MOC (Meta-Object Compiler), is used to extend the C++ language with features like signals and slots. Before the compilation step, the MOC parses the source files written in Qt-extended C++ and generates standard compliant C++ sources from them. Thus the framework itself and applications/libraries using it can be compiled by any standard compliant C++ compiler like Clang, GCC, ICC, MinGW and MSVC

Qt 同时具有商业版权和开源版权,详细可以参看 版权

Qt is available under various licenses: The Qt Company sells commercial licenses, but Qt is also available as free software under several versions of the GPL and the LGPL

下面对 Qt 的相关基础进行简单地分享

Tip: 当前的最新版本为 Qt 5.8 ,此文中的基础概念参看了 《Qt 学习之路 2》


概要


平台与环境

应用的开发无法脱离具体的平台与环境,即便声称为跨平台的框架,在现实情况中,同样一套代码,在不同的平台与环境中也不一定会获得相同的效果

[emacs@h102 ~]$ cat /etc/issue
CentOS release 6.6 (Final)
Kernel \r on an \m

[emacs@h102 ~]$ uname -a 
Linux h102.temp 2.6.32-504.el6.x86_64 #1 SMP Wed Oct 15 04:27:16 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
[emacs@h102 ~]$ gcc -v 
Using built-in specs.
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC) 
[emacs@h102 ~]$ qmake -v 
QMake version 2.01a
Using Qt version 4.8.6 in /usr/local/Trolltech/Qt-4.8.6/lib
[emacs@h102 ~]$

Tip: 虽然 Qt 的最新版本为 Qt 5.8 ,但是这里实验依旧使用的 Qt version 4.8.6


helloworld

要求

  • 使用 Qt 写一个helloworld 的GUI程序

创建项目

实际上就是创建一个专用的文件夹

[emacs@h102 demo]$ pwd
/home/emacs/demo
[emacs@h102 demo]$ mkdir hello
[emacs@h102 demo]$ ls
hello
[emacs@h102 demo]$

代码示例

main.cpp

#include <QApplication> //QApplication 类管理GUI程序的控制流和主设置
#include <QLabel> //QLabel 类用来进行文本或图片的显示

int main(int argc, char *argv[])
{
   QApplication app(argc, argv); //创建一个QApplication对象app,使用main函数的参数进行构造
   QLabel label("Hello world!"); //创建一个QLabel 对象label 使用 "Hello world!" 进行初始化

   label.show(); //调用label的show方法

   return app.exec(); //运行app应用
}

编译执行

[emacs@h102 hello]$ ls
main.cpp
[emacs@h102 hello]$ qmake -project
[emacs@h102 hello]$ ls
hello.pro  main.cpp
[emacs@h102 hello]$ qmake 
[emacs@h102 hello]$ ls
hello.pro  main.cpp  Makefile
[emacs@h102 hello]$ make 
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/local/Trolltech/Qt-4.8.6/mkspecs/linux-g++ -I. -I/usr/local/Trolltech/Qt-4.8.6/include/QtCore -I/usr/local/Trolltech/Qt-4.8.6/include/QtGui -I/usr/local/Trolltech/Qt-4.8.6/include -I. -I. -o main.o main.cpp
g++ -Wl,-O1 -Wl,-rpath,/usr/local/Trolltech/Qt-4.8.6/lib -o hello main.o    -L/usr/local/Trolltech/Qt-4.8.6/lib -lQtGui -L/usr/local/Trolltech/Qt-4.8.6/lib -L/usr/X11R6/lib -lQtCore -lpthread 
[emacs@h102 hello]$ echo $?
0
[emacs@h102 hello]$ ls
hello  hello.pro  main.cpp  main.o  Makefile
[emacs@h102 hello]$ 
[emacs@h102 hello]$ ./hello 
...
...

会弹出一个小窗口

qt_hello.png

编译执行过程中没有报错,从结果来看,符合预期


QApplication

#include <QApplication>

在Qt的应用中,我们通常都可以看到一个 QApplication 对象,那QApplication 是干嘛的?

QApplication 类管理GUI程序的控制流和主设置

QApplication 包含主事件循环, 所有来自窗口系统和其他源的事件将被处理和分配, 它也处理程序的初始化,析构和提供会话管理

对于非GUI的用QCoreApplication 代替QApplication,它不依赖QtGui库

qApp是一个全局的指针,指向QApplication的对象

QApplication的主要职责如下:

  • 1.初始化程序的用户桌面设置:如palette(),font(),doubleClickInterval()(鼠标双击的时间间隔),并一直监视这些属性,以防用户改变他们(得到及时的更新)
  • 2.处理事件:它接收来自底层窗口系统的事件,并把他们分发给关联的窗口,通过sendEvent(),postEvent(),你可以把你自己的事件发给部件
  • 3.解析命令行参数
  • 4.定义程序的观感(被封装在QStyle 对象中):通过setStyle()可以实时的改变
  • 5.知道程序的窗口信息:可以通过widgetAt(),还可以得到一个窗口列表通过topLevelWidgets(),然后通过closeAllWindows()关闭所有窗口
  • 6.管理鼠标操作
  • 7.提供一个复杂的会话管理:它使程序在用户退出时可以“优美”的结束,或者如果干掉一个进程如果这个进程不能保留程序之前的状态(对会话管理不了解,翻译的不准确)

由于QApplication对象做了这么多初始化操作,所以它必须在所以与用户接口有关的对象创建之前被创建

Tip: 引自 《QApplication (GUI 程序中 有且仅有一个)》


QLabel

#include <QLabel>

它继成自 QFrame

QLabel 对象可以用来显示文本和图片

QLabel is used for displaying text or an image. No user interaction functionality is provided. The visual appearance of the label can be configured in various ways, and it can be used for specifying a focus mnemonic key for another widget

相应的属性和方法可以参阅 Qt API 文档


qmake

生成 Qt 应用一般会经历如下三个步骤

qmake -project
qmake
make

那 qmake 是干什么用的呢?

qmake --help 中可以获知

QMake has two modes, one mode for generating project files based on
some heuristics, and the other for generating makefiles. Normally you
shouldn't need to specify a mode, as makefile generation is the default
mode for qmake, but you may use this to test qmake on an existing project

qmake 是用来干两件事的

  • 根据源码产生项目文件 *.pro
  • 根据源码和项目文件产生 Makefile

一般而言对于一个新项目

  • 第一步产生项目文件使用 -project 模式
  • 第二步产生 Makefile 使用 -makefile 模式 ,但是这个模式是默认模式,不用加 -makefile 参数就代表这个模式

模式的详细信息可以参考

Mode:
  -project       Put qmake into project file generation mode
                 In this mode qmake interprets files as files to
                 be built,
                 defaults to *.c; *.ui; *.y; *.l; *.ts; *.xlf; *.qrc; *.h; *.hpp; *.hh; *.hxx; *.H; *.cpp; *.cc; *.cxx; *.C
                 Note: The created .pro file probably will 
                 need to be edited. For example add the QT variable to 
                 specify what modules are required.
  -makefile      Put qmake into makefile generation mode (default)
                 In this mode qmake interprets files as project files to
                 be processed, if skipped qmake will try to find a project
                 file in your current working directory

至于最后一个 make 步骤,就是在通过qmake生成的 Makefile 来编译成目标文件和最终的可执行文件

qmake -project

qmake -project 的结果是生成了一个 *.pro 文件

在这个例子中就是 hello.pro 文件

我们可以来看看其中的内容

[emacs@h102 hello]$ cat hello.pro 
######################################################################
# Automatically generated by qmake (2.01a) Thu Feb 23 17:27:01 2017
######################################################################

TEMPLATE = app
TARGET = 
DEPENDPATH += .
INCLUDEPATH += .

# Input
SOURCES += main.cpp
[emacs@h102 hello]$

从中可知,这个文件是在将所有有源代码包含进来

qmake

qmake 不加参数就是代表的 qmake -makefile,即 makefile 模式,结果是生成了一个 Makefile 文件

在这个例子中就是 Makefile 文件

我们可以来看看其中的内容

[emacs@h102 hello]$ cat Makefile 
#############################################################################
# Makefile for building: hello
# Generated by qmake (2.01a) (Qt 4.8.6) on: Thu Feb 23 17:27:08 2017
# Project:  hello.pro
# Template: app
# Command: /usr/local/Trolltech/Qt-4.8.6/bin/qmake -o Makefile hello.pro
#############################################################################

####### Compiler, tools and options

CC            = gcc
CXX           = g++
DEFINES       = -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED
CFLAGS        = -pipe -O2 -Wall -W -D_REENTRANT $(DEFINES)
CXXFLAGS      = -pipe -O2 -Wall -W -D_REENTRANT $(DEFINES)
INCPATH       = -I/usr/local/Trolltech/Qt-4.8.6/mkspecs/linux-g++ -I. -I/usr/local/Trolltech/Qt-4.8.6/include/QtCore -I/usr/local/Trolltech/Qt-4.8.6/include/QtGui -I/usr/local/Trolltech/Qt-4.8.6/include -I. -I.
LINK          = g++
LFLAGS        = -Wl,-O1 -Wl,-rpath,/usr/local/Trolltech/Qt-4.8.6/lib
LIBS          = $(SUBLIBS)  -L/usr/local/Trolltech/Qt-4.8.6/lib -lQtGui -L/usr/local/Trolltech/Qt-4.8.6/lib -L/usr/X11R6/lib -lQtCore -lpthread 
AR            = ar cqs
RANLIB        = 
QMAKE         = /usr/local/Trolltech/Qt-4.8.6/bin/qmake
TAR           = tar -cf
COMPRESS      = gzip -9f
COPY          = cp -f
SED           = sed
COPY_FILE     = $(COPY)
COPY_DIR      = $(COPY) -r
STRIP         = strip
INSTALL_FILE  = install -m 644 -p
INSTALL_DIR   = $(COPY_DIR)
INSTALL_PROGRAM = install -m 755 -p
DEL_FILE      = rm -f
SYMLINK       = ln -f -s
DEL_DIR       = rmdir
MOVE          = mv -f
CHK_DIR_EXISTS= test -d
MKDIR         = mkdir -p

####### Output directory

OBJECTS_DIR   = ./

####### Files

SOURCES       = main.cpp 
OBJECTS       = main.o
DIST          = /usr/local/Trolltech/Qt-4.8.6/mkspecs/common/unix.conf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/common/linux.conf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/common/gcc-base.conf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/common/gcc-base-unix.conf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/common/g++-base.conf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/common/g++-unix.conf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/qconfig.pri \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/qt_functions.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/qt_config.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/exclusive_builds.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/default_pre.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/release.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/default_post.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/shared.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/unix/gdb_dwarf_index.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/warn_on.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/qt.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/unix/thread.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/moc.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/resources.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/uic.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/yacc.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/lex.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/include_source_dir.prf \
		hello.pro
QMAKE_TARGET  = hello
DESTDIR       = 
TARGET        = hello

first: all
####### Implicit rules

.SUFFIXES: .o .c .cpp .cc .cxx .C

.cpp.o:
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"

.cc.o:
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"

.cxx.o:
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"

.C.o:
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"

.c.o:
	$(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<"

####### Build rules

all: Makefile $(TARGET)

$(TARGET):  $(OBJECTS)  
	$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)

Makefile: hello.pro  /usr/local/Trolltech/Qt-4.8.6/mkspecs/linux-g++/qmake.conf /usr/local/Trolltech/Qt-4.8.6/mkspecs/common/unix.conf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/common/linux.conf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/common/gcc-base.conf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/common/gcc-base-unix.conf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/common/g++-base.conf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/common/g++-unix.conf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/qconfig.pri \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/qt_functions.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/qt_config.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/exclusive_builds.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/default_pre.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/release.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/default_post.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/shared.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/unix/gdb_dwarf_index.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/warn_on.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/qt.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/unix/thread.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/moc.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/resources.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/uic.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/yacc.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/lex.prf \
		/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/include_source_dir.prf \
		/usr/local/Trolltech/Qt-4.8.6/lib/libQtGui.prl \
		/usr/local/Trolltech/Qt-4.8.6/lib/libQtCore.prl
	$(QMAKE) -o Makefile hello.pro
/usr/local/Trolltech/Qt-4.8.6/mkspecs/common/unix.conf:
/usr/local/Trolltech/Qt-4.8.6/mkspecs/common/linux.conf:
/usr/local/Trolltech/Qt-4.8.6/mkspecs/common/gcc-base.conf:
/usr/local/Trolltech/Qt-4.8.6/mkspecs/common/gcc-base-unix.conf:
/usr/local/Trolltech/Qt-4.8.6/mkspecs/common/g++-base.conf:
/usr/local/Trolltech/Qt-4.8.6/mkspecs/common/g++-unix.conf:
/usr/local/Trolltech/Qt-4.8.6/mkspecs/qconfig.pri:
/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/qt_functions.prf:
/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/qt_config.prf:
/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/exclusive_builds.prf:
/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/default_pre.prf:
/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/release.prf:
/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/default_post.prf:
/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/shared.prf:
/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/unix/gdb_dwarf_index.prf:
/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/warn_on.prf:
/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/qt.prf:
/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/unix/thread.prf:
/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/moc.prf:
/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/resources.prf:
/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/uic.prf:
/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/yacc.prf:
/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/lex.prf:
/usr/local/Trolltech/Qt-4.8.6/mkspecs/features/include_source_dir.prf:
/usr/local/Trolltech/Qt-4.8.6/lib/libQtGui.prl:
/usr/local/Trolltech/Qt-4.8.6/lib/libQtCore.prl:
qmake:  FORCE
	@$(QMAKE) -o Makefile hello.pro

dist: 
	@$(CHK_DIR_EXISTS) .tmp/hello1.0.0 || $(MKDIR) .tmp/hello1.0.0 
	$(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/hello1.0.0/ && $(COPY_FILE) --parents main.cpp .tmp/hello1.0.0/ && (cd `dirname .tmp/hello1.0.0` && $(TAR) hello1.0.0.tar hello1.0.0 && $(COMPRESS) hello1.0.0.tar) && $(MOVE) `dirname .tmp/hello1.0.0`/hello1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/hello1.0.0


clean:compiler_clean 
	-$(DEL_FILE) $(OBJECTS)
	-$(DEL_FILE) *~ core *.core


####### Sub-libraries

distclean: clean
	-$(DEL_FILE) $(TARGET) 
	-$(DEL_FILE) Makefile


check: first

mocclean: compiler_moc_header_clean compiler_moc_source_clean

mocables: compiler_moc_header_make_all compiler_moc_source_make_all

compiler_moc_header_make_all:
compiler_moc_header_clean:
compiler_rcc_make_all:
compiler_rcc_clean:
compiler_image_collection_make_all: qmake_image_collection.cpp
compiler_image_collection_clean:
	-$(DEL_FILE) qmake_image_collection.cpp
compiler_moc_source_make_all:
compiler_moc_source_clean:
compiler_uic_make_all:
compiler_uic_clean:
compiler_yacc_decl_make_all:
compiler_yacc_decl_clean:
compiler_yacc_impl_make_all:
compiler_yacc_impl_clean:
compiler_lex_make_all:
compiler_lex_clean:
compiler_clean: 

####### Compile

main.o: main.cpp 
	$(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o main.cpp

####### Install

install:   FORCE

uninstall:   FORCE

FORCE:

[emacs@h102 hello]$ 

这是一个常规的 Makefile, 从banner上可以获知一些头信息

#############################################################################
# Makefile for building: hello
# Generated by qmake (2.01a) (Qt 4.8.6) on: Thu Feb 23 17:27:08 2017
# Project:  hello.pro
# Template: app
# Command: /usr/local/Trolltech/Qt-4.8.6/bin/qmake -o Makefile hello.pro
#############################################################################

其实是在自动调用这条命令 /usr/local/Trolltech/Qt-4.8.6/bin/qmake -o Makefile hello.pro

这个文件非常重要,因为所有的编译信息都配置在其中

Tip: 如果有新的库要加入,就得在这个文件中进行手动调整 ,如要加入 sqlite 库,就要将 LIBS = $(SUBLIBS) -L/usr/local/Trolltech/Qt-4.8.6/lib -lQtGui -L/usr/local/Trolltech/Qt-4.8.6/lib -L/usr/X11R6/lib -lQtCore -lpthread 手动改为 LIBS = $(SUBLIBS) -L/usr/local/Trolltech/Qt-4.8.6/lib -lQtGui -L/usr/local/Trolltech/Qt-4.8.6/lib -L/usr/X11R6/lib -lQtCore -lpthread -lsqlite3

总体上分为如下几个主要部分

[emacs@h102 hello]$ grep '#' Makefile 
#############################################################################
# Makefile for building: hello
# Generated by qmake (2.01a) (Qt 4.8.6) on: Thu Feb 23 17:27:08 2017
# Project:  hello.pro
# Template: app
# Command: /usr/local/Trolltech/Qt-4.8.6/bin/qmake -o Makefile hello.pro
#############################################################################
####### Compiler, tools and options
####### Output directory
####### Files
####### Implicit rules
####### Build rules
####### Sub-libraries
####### Compile
####### Install
[emacs@h102 hello]$
  • 头部信息
  • 编译工具和选项
  • 输出目录
  • 文件
  • 隐式规则
  • 构建规则
  • 子库
  • 编译命令
  • 安装

关于Makefile中的细节,可以查阅网络上的相关资料


make

通过 Makefile 来编译成目标文件和最终的可执行文件

在这个例子中就是 main.ohello


总结

  • gcc -v
  • qmake -v
  • mkdir hello
  • qmake -project
  • qmake
  • make
  • echo $?
  • ./hello
  • cat hello.pro
  • cat Makefile
  • grep '#' Makefile
原文地址 http://soft.dog/2017/02/23/qt-basic-01/

评论