关于cmake qmake make makeile之间的关系问题

2023-10-27

总之  qmake是根据.pro文件生成makefile文件,同理cmake是根据CMakeList.txt生成的makefile文件。

          make再根据makefile文件来编译工程文件

          来完成(预编译)-> (编译)  -> (汇编) -> (链接)中的编译过程。




下面是知乎一位大哥所说,我认为挺好,这里转载一下:


作者:辉常哥
链接:https://www.zhihu.com/question/27455963/answer/89770919
来源:知乎

1.gcc是GNU Compiler Collection(就是GNU编译器套件),也可以简单认为是编译器,它可以编译很多种编程语言(括C、C++、Objective-C、Fortran、Java等等)。

2.当你的程序只有一个源文件时,直接就可以用gcc命令编译它。

3.但是当你的程序包含很多个源文件时,用gcc命令逐个去编译时,你就很容易混乱而且工作量大

4.所以出现了make工具
make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式—通过调用makefile文件中用户指定的命令来进行编译和链接的。

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

6.makefile命令中就包含了调用gcc(也可以是别的编译器)去编译某个源文件的命令。

7.makefile在一些简单的工程完全可以人工手下,但是当工程非常大的时候,手写makefile也是非常麻烦的,如果换了个平台makefile又要重新修改。

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

9.可是cmake根据什么生成makefile呢?它又要根据一个叫CMakeLists.txt文件(学名:组态档)去生成makefile。

10.到最后CMakeLists.txt文件谁写啊?亲,是你自己手写的。

11.当然如果你用IDE,类似VS这些一般它都能帮你弄好了,你只需要按一下那个三角形

12.接着是qmake,qmake是什么,先说一下Qt这个东西。Qt是跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。简单的说就是C++的第三方库,使用这个库你可以很容易生成windows,Linux,MAC os等等平台的图形界面。现在的Qt还包含了开发各种软件一般需要用到的功能模块(网络,数据库,XML,多线程啊等等),比你直接用C++(只带标准内裤那种)要方便和简单。

13.你可以用Qt简简单单就实现非常复杂的功能,是因为Qt对C++进行了扩展,你写一行代码,Qt在背后帮你写了几百上千行,而这些多出来的代码就是靠Qt专有的moc编译器(The Meta-Object Compiler)和uic编译器(User Interface Complier)来重新翻译你那一行代码。问题来了,你在进行程序编译前就必须先调用moc和uic对Qt源文件进行预处理,然后再调用编译器进行编译。上面说的那种普通makefile文件是不适用的,它没办法对qt源文件进行预处理。所以qmake就产生了。

14.qmake工具就是Qt公司制造出来,用来生成Qt 专用makefile文件,这种makefile文件就能自动智能调用moc和uic对源程序进行预处理和编译。qmake当然必须也是跨平台的,跟cmake一样能对应各种平台生成对应makefile文件。

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

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


补充:

gcc——预处理(预编译),编译,汇编,链接

一,预编译

操作步骤:gcc -E hello.c -o hello.i

主要作用:

处理关于 “#” 的指令

【1】删除#define,展开所有宏定义。例#define portnumber 3333

【2】处理条件预编译 #if, #ifdef, #if, #elif,#endif

【3】处理“#include”预编译指令,将包含的“.h”文件插入对应位置。这可是递归进行的,文件内可能包含其他“.h”文件。

【4】删除所有注释。/**/,//。

【5】添加行号和文件标识符。用于显示调试信息:错误或警告的位置。

【6】保留#pragma编译器指令。(1)设定编译器状态,(2)指示编译器完成一些特定的动作。


二,编译(编译器主要做了什么)

操作步骤:gcc -s hello.c -o hello.s

主要作用:1.扫描(词法分析),2.语法分析,3.语义分析,4.源代码优化(中间语言生成),5.代码生成,目标代码优化。

    目标代码优化器:选择合适的寻址方式,左移右移代替乘除,删除多余指令。


三,汇编

操作步骤:gcc -c hello.c -o hello.o

主要作用:汇编器是将汇编代码转变成可以执行的指令,生成 目标文件。


四,链接

操作步骤:gcc hello.o -o hello

主要作用:通过编译器的5个步骤后,我们获得目标代码,但是里面的各个地址还没有确定,空间还没有分配。

链接过程主要包括:地址和空间的分配等。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于cmake qmake make makeile之间的关系问题 的相关文章

  • MFC中Picture Control控件的使用

    项目源码下载 http download csdn net download zhuzemin45 12005643 所有需要的文件都打包在项目中 下载解压即可 MFC中红绿指示灯控件的使用 Picture Control控件创建指示灯步骤
  • 【Liunx常用操作】Ubuntu Server系统配置软件源

    提示 为保证文章的正确性和实用性 文章内容可能会不定时优化改进 若您有建议或者文章存在错误请私信留言或评论指正 下面以Ubuntu22 04操作系统为例 介绍具体的操作步骤 如果本文对你有帮助 记得关注加收藏 1 文章前言 本章以Ubunt

随机推荐

  • ros 程序断点调试_ROS下如何Debug?5分钟快速入门

    更受欢迎的开源机器人操作系统ROS已经九岁了 ROS给机器人系统的进程间通讯提供了一个统一的 跨平台的框架 这给经常连接几十个各种各样设备的机器人应用带来了非常大的便利 我也很喜欢使用ROS 以前打Robocup的时候 整个人形机器人的上层
  • gin 十一. gin-contrib之cache 缓存

    目录 一 基础 api 概述 二 内存级缓存示例 三 操作redis示例 一 基础 gin contrib cache 是一个 Gin 框架的中间件 它提供了一套简单易用的缓存解决方案 支持一下功能 缓存 HTTP 请求结果 提高网站性能
  • ElGamal算法java实现

    ElGamal算法 是一种较为常见的加密算法 它是基于1985年提出的公钥密码体制和椭圆曲线加密体系 既能用于数据加密也能用于数字签名 其安全性依赖于计算有限域上离散对数这一难题 在加密过程中 生成的密文长度是明文的两倍 且每次加密后都会在
  • 基于Matlab模拟时变瑞利衰落信道中的差分放大转发中继

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab仿真内容点击 智能优化算法 神经网络预测 雷达通信 无线传感器 电力系统 信号
  • 域名解析问题记录

    链接vpn之后发现不能上网 域名解析不了 1 查看域名能否解析 nslookup baidu com 2 添加114一行 这是国内的域名解析服务器 sudo vim etc resolv conf sangfor dns client na
  • 表白墙程序

    目录 一 页面代码部分 二 设计程序 二 实现 doPost 编辑 三 实现 doGet 四 前端代码部分 五 使用数据库存储数据 一 页面代码部分 在之前的一篇博客中 已经写过了表白墙的页面代码实现 这里就不再重复了 页面代码如下 div
  • 大数据技术:Spark相关问题汇总

    问题导读 1 Spark有几种部署方式 请分别简要论述 2 Spark任务使用什么方式进行任务提交 3 Spark常用算子reduceByKey与groupByKey的区别 哪一种更具优势 4 简述SparkSQL中RDD DataFram
  • Spring源码(十六)bean实例化过程CreateBeanInstance方法

    Spring源码 十六 bean实例化过程CreateBeanInstance方法 实例化过程以及创建对象的方式 总结 实例化过程以及创建对象的方式 protected Object doCreateBean String beanName
  • java之socket的OOBInline和UrgentData和发送心跳包研究

    UrgentData可以理解为紧急发送数据方式 如果我们客户端先用write方法写入数据 再用UrgentData发送数据 再去执行flush操作 我们可以得到服务端先打印UrgentData发送的数据 然后再打印write写入的数据 客户
  • 注意力提高神经回路的突触功效和信噪比(Farran Briggs, George R. Mangun& W. Martin Usrey)

    注意力是知觉的一个重要组成部分 然而 注意调节神经沟通来指导行为的机制却知之甚少 为了阐明注意力的突触机制 我们开发了一种神经沟通注意调节的敏感测定 在执行视觉空间注意任务的警戒键中 我们通过电刺激丘脑外侧膝状体神经元中的神经元 同时记录来
  • 我为什么鼓励你读计算机博士

    看过 水浒传 的朋友都知道 梁山的一百单八将因为各种理由加入了水寨 走上了劫富济贫 替天行道的路 我2006年从南京大学本科毕业以后 耳闻目睹了数百位计算机专业的博士 生 他们选择读博士的理由可以说比梁山好汉更为复杂 gt gt gt gt
  • 企业运维实战--ELK日志分析平台之elasticsearch实战

    企业运维实战 ELK日志分析平台之elasticsearch实战 ELK日志分析平台 简介 安装elasticsearch elasticsearch集群部署 为集群添加监控管理 监控1 监控2 ELK日志分析平台 简介 ELK由Elast
  • Python 元类实现ORM

    目录 ORM概念 new init call 的介绍 通过元类简单实现ORM中的insert功能 抽取到基类中 ORM概念 ORM Object Ralational Mapping 对象关系映射 用来把对象模型表示的对象映射到基于 SQL
  • 基于51单片机的电烤箱微波炉数码管显示proteus仿真

    硬件设计 MCU基于51单片机 ADC采用TLC2543 芯片简介如下 1 12位分辩率A D转换器 2 在工作温度范围内10 s转换时间 3 11个模拟输入通道 4 3路内置自测试方式 5 采样率为66kbps 6 线性误差 1LSBma
  • 解决Windows提示缺少mfc140.dll文件的问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或者损坏了 这时你只需下载这个mfc140 dll文件进行安装 前提是找到适合
  • Ant Design Vue(2.2.8) 组件样式覆盖 -- 非弹窗和弹窗 -- 全局非全局

    1 简单覆盖 非弹窗 deep 类名 div class deviceFirmManage common box div class search box div div
  • 动态通讯录

    目录 1 修改联系人结构体 2 修改初始化功能 3 增加判断通讯录是否需要扩容 4 修改删除功能 在静态内存的基础之上 我们试着用动态内存开辟空间的方式去修改通讯录 动态通讯录是对静态通讯录的补充 只需要修改部分代码就可行 1 修改联系人结
  • 人工智能中蕴含的情商

    古语云 人之初 性本善 性相近 习相远指的是生于天地之间的为人处事之道 善良并不意味着胆小与懦弱 格物斯坦认为善良的人往往具有较高的情商和组织协调能力 善待世间的一切天地万物 一切是非恩怨 一切明争暗斗 且听吾分析到来 有句话是这样说的 情
  • Building an MFC project for a non-Unicode character set is deprecated

    VS2013多字节工程问题 使用VS2013编译旧版VC 程序时 提示Building an MFC project for a non Unicode character set is deprecated 微软提供了解决方案 一 错误信
  • 关于cmake qmake make makeile之间的关系问题

    总之 qmake是根据 pro文件生成makefile文件 同理cmake是根据CMakeList txt生成的makefile文件 make再根据makefile文件来编译工程文件 来完成 预编译 gt 编译 gt 汇编 gt 链接 中的