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

作者:玟清
链接:https://www.zhihu.com/question/27455963/answer/36722992
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

1. make 是用来执行Makefile的
2. Makefile是类unix环境下(比如Linux)的类似于批处理的"脚本"文件。其基本语法是: 目标+依赖+命令,只有在目标文件不存在,或目标依赖的文件更旧,命令才会被执行。由此可见,Makefile和make可适用于任意工作,不限于编程。比如,可以用来管理latex。
3. Makefile+make可理解为类unix环境下的项目管理工具,但它太基础了,抽象程度不高,而且在windows下不太友好(针对visual studio用户),于是就有了跨平台项目管理工具cmake
4. cmake是跨平台项目管理工具,它用更抽象的语法来组织项目。虽然,仍然是目标,依赖之类的东西,但更为抽象和友好,比如你可用math表示数学库,而不需要再具体指定到底是math.dll还是libmath.so,在windows下它会支持生成visual studio的工程,在linux下它会生成Makefile,甚至它还能生成eclipse工程文件。也就是说,从同一个抽象规则出发,它为各个编译器定制工程文件。
5. cmake是抽象层次更高的项目管理工具,cmake命令执行的CMakeLists.txt文件
6. qmake是Qt专用的项目管理工具,对应的工程文件是*.pro,在Linux下面它也会生成Makefile,当然,在命令行下才会需要手动执行qmake,完全可以在qtcreator这个专用的IDE下面打开*.pro文件,使用qmake命令的繁琐细节不用你管了。

总结一下,make用来执行Makefile,cmake用来执行CMakeLists.txt,qmake用来处理*.pro工程文件。Makefile的抽象层次最低,cmake和qmake在Linux等环境下最后还是会生成一个Makefile。cmake和qmake支持跨平台,cmake的做法是生成指定编译器的工程文件,而qmake完全自成体系。

具体使用时,Linux下,小工程可手动写Makefile,大工程用automake来帮你生成Makefile,要想跨平台,就用cmake。如果GUI用了Qt,也可以用qmake+*.pro来管理工程,这也是跨平台的。当然,cmake中也有针对Qt的一些规则,并代替qmake帮你将qt相关的命令整理好了。

另外,需要指出的是,make和cmake主要命令只有一条,make用于处理Makefile,cmake用来转译CMakeLists.txt,而qmake是一个体系,用于支撑一个编程环境,它还包含除qmake之外的其它多条命令(比如uic,rcc,moc)。

上个简图,其中cl表示visual studio的编译器,gcc表示linux下的编译器
<img src="https://pic3.zhimg.com/50/f57298cefba18fca5f31b8762f01d933_hd.jpg" data-rawwidth="1056" data-rawheight="816" class="origin_image zh-lightbox-thumb" width="1056" data-original="https://pic3.zhimg.com/f57298cefba18fca5f31b8762f01d933_r.jpg">
<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、付费专栏及课程。

余额充值