编译利器qmake——关于makefile、make、cmake、qmake、make install

1.基础知识

1.1、gcc(编译器套件,可命令行手动编译)

gcc是GNU Compiler Collection(就是GNU编译器套件),也可以简单认为是编译器,它可以编译很多种编程语言(括C、C++、Objective-C、Fortran、Java等等),可以通过gcc命令逐个进行编译。

1.2、make(利用makefile编译的智能工具)

当你的程序包含很多个源文件时,用gcc命令逐个去编译时,你就很容易混乱而且工作量大。make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式—通过调用makefile文件中用户指定的命令来进行编译和链接的。

1.3、makefile(一个文件,里边是编译规则)

makefile是什么?简单的说就像一首歌的乐谱,乐谱规定了曲子的演奏规则,make工具就像指挥家,指挥家根据乐谱指挥整个乐团怎么样演奏,make工具就根据makefile中的命令和规则进行编译和链接的。

makefile命令中就包含了调用gcc(也可以是别的编译器)去编译某个源文件的命令。makefile在一些简单的工程完全可以人工手写,但是当工程非常大的时候,手写makefile也是非常麻烦的,如果换了个平台makefile又要重新修,非常麻烦。

1.4、cmake(生成makefile的智能工具)

为了修复1.3的问题,出现了cmake这个工具,cmake就可以更加简单的生成makefile文件给上面那个make用。当然cmake还有其他功能,就是可以跨平台生成对应平台能用的makefile,你不用再自己去修改了。

cmake根据一个叫CMakeLists.txt文件去生成makefile。

最后CMakeLists.txt文件谁写啊?亲,是你自己手写的。当然如果你用IDE,类似VS这些一般它都能帮你弄好了,你只需要按一下那个三角形

1.5、qmake(Qt生成makefile的智能工具)

qmake类似于cmake,既能根据头文件、源文件之间的关系生成pro文件,也可以通过用户定义的pro文件生成对应的makefile。

qmake工具就是Qt公司制造出来,用来生成Qt专用makefile文件,这种makefile文件就能自动智能调用moc和uic对源程序进行预处理和编译。

qmake当然必须也是跨平台的,跟cmake一样能对应各种平台生成对应makefile文件。qmake是根据Qt 工程文件(.pro)来生成对应的makefile的。工程文件(.pro)相对来说比较简单,一般工程你都可以自己手写,但是一般都是由Qt的开发环境 Qt Creator自动生成的,你还是只需要按下那个邪恶三角形就完事了。

由于qmake很简单很好用又支持跨平台,而且是可以独立于它的IDE,所以你也可以用在非Qt工程上面,照样可以生成普通的makefile,只要在pro文件中加入CONFIG -= qt 就可以了。

1.6、make install

是用来安装的,它也从Makefile中读取指令,安装到指定的位置。

本节参考:https://blog.csdn.net/u010710458/article/details/80175233

2. linux通常的编译、安装过程

简单来说,make 是编译,make install 是安装。

总结:linux编译安装中configure、make和make install各自的作用

./configure是用来检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本。

make是用来编译的,它从Makefile中读取指令,然后编译。

make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置。

2.1、configure

这一步一般用来生成 Makefile,为下一步的编译做准备,你可以通过在 configure 后加上参数来对安装进行控制,比如代码:./configure --prefix=/usr上面的意思是将该软件安装在 /usr 下面,执行文件就会安装在 /usr/bin.同时一些软件的配置文件你可以通过指定 --sys-config= 参数进行设定。有一些软件还可以加上 --with、–enable、–without、–disable 等等参数对编译加以控制,你可以通过允许 ./configure --help 察看详细的说明帮助。

2.2、make

这一步就是编译,大多数的源代码包都经过这一步进行编译(当然有些perl或Python编写的软件需要调用perl或python来进行编译)。如果 在 make 过程中出现 error ,你就要记下错误代码(注意不仅仅是最后一行),然后你可以向开发者提交 bugreport(一般在 INSTALL 里有提交地址),或者你的系统少了一些依赖库等,这些需要自己仔细研究错误代码。make 的作用是开始进行源代码编译,以及一些功能的提供,这些功能由他的 Makefile 设置文件提供相关的功能,比如 make install 一般表示进行安装,make uninstall 是卸载,不加参数就是默认的进行源代码编译。
make 是 Linux 开发套件里面自动化编译的一个控制程序,他通过借助 Makefile 里面编写的编译规范进行自动化的调用 gcc 、ld 以及运行某些需要的程序进行编译的程序。一般情况下,他所使用的 Makefile 控制代码,由 configure 这个设置脚本根据给定的参数和系统环境生成。

2.3、make install

这条命令来进行安装(当然有些软件需要先运行 make check 或 make test来进行一些测试),这一步一般需要你有 root 权限(因为要向系统写入文件)

3.使用qmake编译过程

文本程序到可执行文件生成无论在什么平台大致分为以下几个部分:
  
  1.用编辑器编写源代码,如.c文件。
  2.用编译器编译代码生成目标文件,如.o。
  3.用链接器连接目标代码生成可执行文件,如.exe。
  
  我们知道编译和链接阶段是靠g++和gcc编译器来完成,这两个编译阶段是相同的,但是链接阶段g++默认链接c++库,所以一般情况下用gcc编译c文件,而g++编译cpp文件。当然g++也可以编译c文件,而gcc编译cpp文件则需要在后面加上参数-lstdc++,作用就是链接c++库。
  
  但是如果编译和链接的阶段如果源文件太多,一个一个编译时就会特别麻烦,于是人们想到,为什么不设计一种类似批处理的程序,来批处理编译源文件呢,于是就有了make工具,它是一个自动化编译工具,你可以使用一条命令实现完全编译。但是你需要编写一个规则文件,make依据它来批处理编译,这个文件就是makefile,所以编写makefile文件也是一个程序员所必备的技能。
  
  对于一个大工程,编写makefile实在是件复杂的事,于是人们又想,为什么不设计一个工具,读入所有源文件之后,自动生成makefile呢,于是就出现了cmake工具,它能够输出各种各样的makefile或者project文件,从而帮助程序员减轻负担。但是随之而来也就是编写cmakelist.txt文件,它是cmake所依据的规则。

makefile文件保存了编译器和连接器的参数选项,还表述了所有源文件之间的关系(源代码文件需要的特定的包含文件,可执行文件要求包含的目标文件模块及库等)。

创建程序(make程序)首先读取makefile文件,然后再激活编译器,汇编器,资源编译器和连接器以便产生最后的输出,最后输出并生成 的通常是可执行文件.创建程序利用内置的推理规则来激活编译器,以便通过对特定cpp文件的编译来产生特定的obj文件。

用命令行进行Qt编译过程如下:

1、手动编写或者利用qmake工具生成pro文件
2、利用qmake工具生成makefile
3、make工具利用makefile编译和链接
4、install(可有可无)

3.0、了解qmake模式

运行qmake的
语法采用以下简单形式:

  qmake [模式] [选项] 文件

qmake支持两种不同的操作模式。 在默认模式下,qmake使用项目文件中的信息来生成Makefile,但是也可以使用qmake来生成项目文件。 如果要显式设置模式,则必须在所有其他选项之前指定它。 该模式可以是以下两个值之一:

-makefile:qmake输出将是一个Makefile。默认为该模式。

-project:qmake输出将是一个项目文件。他是根据文件中的依赖关系,自动生成一个pro文件,不用自己手写。

3.1、生成pro:

使用qmake生成与平台无关的pro文件。
命令:qmake -project

3.2、生成makefike

利用pro文件生成与平台相关的Makefile文件 。Makefile文件中包含了要创建的目标文件和可执行文件、创建目标文件所依赖的文件和创建每个目标文件时需要运行的命令等信息。
命令:qmake

3.3、编译并生成可执行程序

使用make命令完成自动编译,make就是通过读入Makefile文件的内容来执行编译工作的。会为每个源文件生成一个对应的.o文件,最后将目标文件链接生成最终的可执行文件。
命令:make

注意事项:

1、对于较复杂的项目(例如子项目),项目中可能包含多个pro文件,qmake生成makefile时,每个pro文件都会生成相对应的一个makefile,即每个pro文件都会执行一次makefile。假如用了pri文件,里边有一些操作,比如拷贝文件等,假如用$$OUT_PWD指定了目录,结果就会使得每个pro文件都执行了该操作,导致在多个pro所在的目录都进行了拷贝。

2、windows系统上边,会自动生成3个makefile,如下所示。(但是linux上不会这样,只会生成一个makefile)。所以在windows上似乎也会执行3次makefile操作,假如在pro文件里边使用message()函数,可以看到打印了3次信息。(这个地方还没有弄得非常清楚。)
在这里插入图片描述

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值