热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[翻译学习]qmake,ProjectFiles与Makefile

原文地址,翻译完了发现这书是《C++QT设计模式》1.6节的内容……C++应用程序通常由许多源文件,头文件和外部库组成。在一般的项目开发过程中,源文件和库被添加,更改或删除。要bu

原文地址,翻译完了发现这书是《C++QT设计模式》1.6节的内容……

C++应用程序通常由许多源文件,头文件和外部库组成。在一般的项目开发过程中,源文件和库被添加,更改或删除。要build一个能反映项目当前状态的可执行文件,这些变更要求编译所有受影响的文件,并将生成的对象文件进行正确链接。这种changing-rebuilding的过程通常会发生很多次。

追踪这样一个项目中的所有部分需要一种机制,能精确地指定涉及到的输入文件,build所需工具,中间目标及其依赖关系,以及最终的可执行目标。

最广泛应用的编译工程的工具是make。Make从Makefile里读取项目规格(project specifications )的细节以及编译器说明。Makefile类似于shell脚本但是至少包含以下内容:

  • 编译某些类型文件的规则(Rules),例如要从一个*.cpp文件获取一个*.o文件,你必须为cpp文件执行gcc -c。
  • 包含项目所需的所有源文件和头文件名称的源文件(Sources)和头文件(Headers)列表。
  • 指定哪些可执行文件/库必须被build的目标文件(targets)
  • 列出当某些文件变更时需要重新build哪些目标的依赖关系(Dependencies )

make命令默认载入当前工作路径下名为Makefile的文件并且执行制定的build步骤(编译和链接)

使用make的直接好处是,它不盲目地每次都编译所有文件,而只重新编译发生变更或被其他变更影响到的文件。

图1.1显示了build QT应用所涉及到的步骤。

[翻译学习]qmake, Project Files 与 Makefile

使用QT,让编程人员不再需要编写makefile了。QT提供了一个叫qmake的工具来生成Makefiles。以某种方式运行make并理解它的输出还是必要的。大部分IDE通过一个按钮或者类似的东西来执行make并显示或过滤它的输出。

要创建一个Makefile,qmake需要一个工程文件(*.pro)。一个工程文件记录了build工程所需的所有其他文件、配置(options)以及文件位置。工程文件比Makefile更简单,也更易被用户创建。同时,虽然程序员很容易就能创建一个工程文件,qmake依然能使用qmake -project命令来生成一个简单的工程文件,qmake会记录当前工作目录下所有的源文件(*.cpp)和头文件(*.h)作为Sources and Headers。生成的工程文件将命名为命令参数-o后的部分。如果没有加-o参数或者-o指定的名字为空,qmake会用当前工作路径来命名工程文件以及最终的可执行文件。

在工程文件被创建后,qmake命令会基于工程文件创建makefile。接着,make命令能按照makefile中的说明去试着build一个可执行文件。可执行文件名由TARGET变量定义,默认是project名。

下面的记录显示了如何用qmake来build一个我们讨论、编译并运行的例1.1种的小程序。每步骤被新创建出来的文件为斜体。(译注:斜体在这里面不明显,我加粗了)

src/early-examples/example0> ls
fac.cpp
src/early-examples/example0> qmake -project
src/early-examples/example0> ls
example0.pro fac.cpp                           # 因为文件夹名字是example0,所以工程文件名也是了
src/early-examples/example0> cat example0.pro

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

# Input
SOURCES += fac.cpp                           #这个文件夹下原来就这个文件
src/early-examples/example0> qmake
src/early-examples/example0> ls
example0.pro fac.cpp Makefile                #makefile出来了
src/early-examples/example0> make
g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB
  -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I.
  -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore
  -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4
  -I. -I. -I. -o fac.o fac.cpp
g++ -o example0 fac.o  -L/usr/lib -lQtGui -lQtCore -lpthread
src/early-examples/example0> ls
example0 example0.pro fac.cpp fac.o Makefile #可执行文件出来了
src/early-examples/example0>

注意,你能看到执行make时候传的参数,如果遇到任何错误,你也将看到它们。现在你可以运行这个应用程序了。

今后你应当使用qmake和make来做编译链接,而不是直接从命令行运行编译器。这大大简化了build过程,特别是项目包含多个源文件、头文件和库文件的时候。(译注:我这种小白当然是用qtcreator了,哈哈。)

 


推荐阅读
  • 我们正在使用GNU Make来构建我们的系统,在makefile文件的末尾,我们通过一个名为Makedepends的包含来生成一系列的.d文件。然而,当文件被删除或移动时,依赖关系会中断,我们需要寻找一种方法来优雅地处理这种情况。 ... [详细]
  • VMware 15.5.7 中文版激活方法
    本文提供了一种有效的方法来激活 VMware 15.5.7 的中文版本,同时介绍了如何利用最新的激活码进行操作,确保用户能够顺利使用。 ... [详细]
  • 这个报错出现在userDao里面,sessionfactory没有注入。解决办法:spring整合Hibernate使用test测试时要把spring.xml和spring-hib ... [详细]
  • 本文探讨了Flutter和Angular这两个流行框架的主要区别,包括它们的设计理念、适用场景及技术实现。 ... [详细]
  • DropBlock:一种卷积网络的正则化技术
    本文详细探讨了DropBlock这一正则化方法在卷积神经网络中的应用与效果。通过结构化的dropout方式,即在特征图中连续区域内的单元同时被丢弃,DropBlock有效解决了传统dropout在卷积层应用时效果不佳的问题。更多理论分析及其实现细节可参考原文链接。 ... [详细]
  • Unix与Linux的起源与发展
    本文详细探讨了Unix与Linux的操作系统起源,从自由软件运动的兴起,到Linux内核的诞生,全面解析了这两款操作系统的发展历程及其对现代计算技术的影响。 ... [详细]
  • 四月个人任务:Linux基础操作与网络管理
    本文介绍了两项主要任务:编写一个脚本来检测192.168.1.0/24子网中当前在线的IP地址,以及如何在Linux系统中挂载Windows网络共享目录。通过具体步骤和代码示例,帮助读者理解和掌握相关技能。 ... [详细]
  • 深入解析 Zend Guard 4 功能与配置
    本文旨在通过图文并茂的方式详细介绍 Zend Guard 4 的核心功能及其配置方法,特别适合英文阅读能力有限的技术人员。文中不仅提供了详细的步骤说明,还附带了实际操作中的注意事项,帮助读者更好地理解和应用这一工具。 ... [详细]
  • 本文介绍了多种Eclipse插件,包括XML Schema Infoset Model (XSD)、Graphical Editing Framework (GEF)、Eclipse Modeling Framework (EMF)等,涵盖了从Web开发到图形界面编辑的多个方面。 ... [详细]
  • 本文探讨了 Boost 库中的 Program Options 组件,这是一个强大的工具,用于解析命令行参数和配置文件。文章介绍了如何正确设置和使用该组件,包括处理复杂选项和负数值的方法。 ... [详细]
  • 本文探讨了如何使Shell和程序同时响应Ctrl-C信号的方法,即通过将两者置于同一进程组并将其设为终端的前台进程组。 ... [详细]
  • Mysqlcheck作为MySQL提供的一个实用工具,主要用于数据库表的维护工作,包括检查、分析、修复及优化等操作。本文将详细介绍如何使用Mysqlcheck工具,并提供一些实践建议。 ... [详细]
  • 本文详细介绍了如何在本地环境中安装配置Frida及其服务器组件,以及如何通过Frida进行基本的应用程序动态分析,包括获取应用版本和加载的类信息。 ... [详细]
  • 在日常运维中,频繁地对多台Linux服务器进行用户管理是一项耗时的任务。为了提高效率,可以通过编写Expect脚本来实现远程自动化操作,从而简化这一过程。 ... [详细]
  • 使用IntelliJ IDEA高效开发与运行Shell脚本
    本文介绍了如何利用IntelliJ IDEA中的BashSupport插件来增强Shell脚本的开发体验,包括插件的安装、配置以及脚本的运行方法。 ... [详细]
author-avatar
有海的地方最美_171
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有