make makefile cmake qmake都是什么,有什么区别?

本文详细介绍了编译工具GCC、Make、CMake、QMake的区别及应用。解释了这些工具如何帮助开发者更高效地管理和编译复杂的软件项目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文转载自知乎,链接和作者信息如下。
作者:辉常哥
链接: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 就可以了。

17、 这样qmake和cmake有什么区别?
不好意思,cmake也是同样支持Qt程序的,cmake也能生成针对qt 程序的那种特殊makefile,
只是cmake的CMakeLists.txt 写起来相对与qmake的pro文件复杂点。
qmake 是为 Qt 量身打造的,使用起来非常方便,但是cmake功能比qmake强大。
一般的Qt工程你就直接使用qmake就可以了,cmake的强大功能一般人是用不到的。
当你的工程非常大的时候,又有qt部分的子工程,又有其他语言的部分子工程,据说用cmake会 方便,我也没试过。
<think>嗯,用户之前遇到了关于Qt的编译错误,我帮他解决了QString找不到的问题。现在他问的是“.so 需要是CMake还是QMake”。看起来用户可能是在开发一个动态库(.so文件),并且对构建工具的选择有疑问。 首先,我需要确认用户的使用场景。他可能是在Linux下开发,因为.so是Linux的动态库后缀。他可能正在使用Qt框架,因为之前的问题涉及QString和QMake。但用户现在想知道应该用CMake还是QMake来生成这个动态库。 用户可能对这两个构建工具的区别不太清楚,或者在选择上有困惑。需要解释两者的不同,各自的优缺点,以及适用场景。同时,用户可能关心如何配置,特别是如何生成.so文件,以及是否需要特定的模块或设置。 考虑到用户之前的问题涉及QMake,可能他现在在使用Qt Creator,而Qt项目通常使用QMakeCMake。不过,Qt官方现在更推荐CMake,尤其是在新版本中。所以需要指出这一点,并说明CMake逐渐成为Qt项目的主流选择。 用户可能想知道哪个更适合他的项目,特别是如果项目不仅依赖Qt还有其他库,或者需要跨平台构建。CMake的灵活性和广泛支持可能更适合复杂项目,而QMake对于纯Qt的小型项目可能更简单。 另外,用户可能对如何用这两个工具生成.so文件的具体配置步骤感兴趣。需要给出简单的示例,比如QMake的.pro文件和CMakeCMakeLists.txt,说明如何设置生成动态库。 还要注意用户可能的误区,比如是否需要手动指定生成.so,或者是否有其他配置要求。例如,在QMake中,CONFIG += sharedlib会自动处理,而CMake中需要add_library(... SHARED)。 最后,总结建议,根据项目需求和未来维护考虑,推荐使用CMake,尤其是如果项目复杂或需要与其他系统集成。而对于简单纯Qt项目,QMake可能更快上手。</think>--- ### **核心结论** 生成`.so`动态库**既可用QMake也可用CMake**,但选择取决于: - **QMake**:适合纯Qt小型项目,语法简单 - **CMake**:适合跨平台、复杂项目,尤其需集成非Qt组件 --- ### **详细对比分析** #### **1. QMake方案(传统Qt项目)** **适用场景**: - 项目完全基于Qt框架 - 需要快速创建小型库 - 开发环境为Qt Creator **配置示例** (`HelloLib.pro`): ```makefile QT += core # 必须声明Qt模块 TEMPLATE = lib CONFIG += sharedlib # 关键配置:生成动态库 SOURCES += hello.cpp HEADERS += hello.h ``` **特点**: - 自动处理`.so`的生成路径(默认在`build-*`目录) - 依赖Qt Creator环境配置 - 跨平台能力较弱(需手动调整.pro文件) --- #### **2. CMake方案(现代跨平台)** **适用场景**: - 项目混合使用Qt和其他库(如OpenCV、Boost) - 需要支持多编译器(MSVC/GCC/Clang) - 计划集成CI/CD等自动化流程 **配置示例** (`CMakeLists.txt`): ```cmake cmake_minimum_required(VERSION 3.16) project(HelloLib) # 关键配置:查找Qt Core模块 find_package(Qt6 COMPONENTS Core REQUIRED) # 声明生成动态库 add_library(HelloLib SHARED hello.cpp hello.h ) # 链接Qt Core库 target_link_libraries(HelloLib PRIVATE Qt6::Core) # 设置输出路径(可选) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) ``` **特点**: - 明确控制构建过程(如`.so`版本号、符号隐藏) - 支持更精细的依赖管理(`PRIVATE/PUBLIC/INTERFACE`) - 跨平台构建更稳定(通过`-DCMAKE_PREFIX_PATH=your_qt_path`指定Qt位置) --- ### **关键决策因素** | 特性 | QMake | CMake | |--------------------|---------------------------|-----------------------------| | 学习曲线 | 简单(仅需.pro语法) | 较陡峭(需掌握CMake语法) | | Qt集成 | 原生支持 | 需`find_package(QtX)` | | 跨平台能力 | 依赖Qt Creator配置 | 原生支持(独立于IDE) | | 第三方库支持 | 有限 | 强大(通过`find_package`) | | 调试便捷性 | 自动生成Makefile | 需手动配置`CMakeLists.txt` | | 未来维护性 | 逐渐被Qt官方弱化 | 官方推荐的新项目标准 | --- ### **典型场景选择建议** 1. **纯Qt小程序** → QMake(快速开发) ```bash qmake && make # 2步生成.so ``` 2. **混合技术栈项目** → CMake ```bash mkdir build && cd build cmake -DCMAKE_PREFIX_PATH=/opt/Qt6/lib/cmake .. make # 生成libHelloLib.so ``` 3. **需要ABI兼容性控制** → CMake ```cmake # 添加版本号和符号隐藏 set_target_properties(HelloLib PROPERTIES VERSION 1.2.3 SOVERSION 1 CXX_VISIBILITY_PRESET hidden ) ``` --- ### **迁移工具推荐** 如果已有QMake项目想转CMake: 1. 使用Qt官方转换工具: ```bash qt-cmake-converter --qmake <path/to/qmake> HelloLib.pro ``` 2. 或手动创建`CMakeLists.txt`,参考[Qt CMake手册](https://doc.qt.io/qt-6/cmake-manual.html) --- ### **常见问题解决** **Q:CMake报错`Could NOT find Qt6`?** ```bash # 指定Qt安装路径(示例) cmake -DCMAKE_PREFIX_PATH=/opt/Qt6/6.5.0/gcc_64/lib/cmake .. ``` **Q:如何控制`.so`文件名?** ```cmake # 在CMakeLists.txt中添加 set_target_properties(HelloLib PROPERTIES OUTPUT_NAME "custom_name") ``` --- ### **性能对比(构建速度)** - **小型项目**:QMake更快(生成Makefile耗时少) - **大型项目**:CMake + Ninja更优(支持并行编译) ```bash cmake -GNinja .. # 使用Ninja代替Make ninja ``` --- 选择工具时,建议优先考虑团队的熟悉程度和项目的长期维护需求。对于新项目,**Qt官方推荐CMake**作为未来主要构建系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值