热门标签 | 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了,哈哈。)

 


推荐阅读
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • PatchODAX8: ... [详细]
  • 【技术分享】一个 ELF 蠕虫分析
    【技术分享】一个 ELF 蠕虫分析 ... [详细]
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • PG12新增的VACUUM命令的SKIP_LOCKED选项
    PG12版本的VACUUM命令新增了SKIP_LOCKED选项,该选项使得vacuum命令在遇到被lock住的table时可以跳过并被视为成功执行。之前的版本中,vacuum命令会一直处于等待状态。本文还提到了PostgreSQL 12.1版本的相关信息。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • LINUX学习之centos7营救模式
    今天卸载软件的时候,不小心把GNOME的一些组件给卸了,导致桌面无法正常开启,会卡在启动过程中,而我的开机启动模式又是设置为图形界面,所以一开LINUX就卡住了,进入不了命令行界面 ... [详细]
  • 三、查看Linux版本查看系统版本信息的命令:lsb_release-a[root@localhost~]#lsb_release-aLSBVersion::co ... [详细]
  • MySQL5.6.40在CentOS764下安装过程 ... [详细]
  • linux 字符串数组初始化,C++字符数组初始化方法的分析
    发现了一个字符数组初始化的误区,而这个往往能导致比较严重的性能问题,分析介绍如下:往往我们在初始化一个字符数组,大概有如下几 ... [详细]
  • golang源码分析调度概述
    golang源码分析-调度过程概述本文主要概述一下golang的调度器的大概工作的流程,众所周知golang是基于用户态的协程的调度来完成多任务的执行。在Linux ... [详细]
  • VS用c语言连接mysql,c语言连接mysql完整演示
    #include#includeintmain(){MYSQL*conn;创建一个指向mysql数据类型的指针connmysql_init(NULL);mysql的初始化if(!c ... [详细]
  • Linux 中使用 clone 函数来创建线程
    2019独角兽企业重金招聘Python工程师标准Linux上创建线程一般使用的是pthread库实际上libc也给我们提供了创建线程的函数那就是cloneintclone(i ... [详细]
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社区 版权所有