make 是一个自动化构建工具,它根据一个名为 Makefile 的文件来决定如何编译和链接程序,在 Qt 生态系统中,我们通常不手动编写 Makefile,而是使用 Qt 提供的工具来自动生成它。

核心概念:qmake vs. CMake
在深入 make 之前,必须先理解 Qt 项目的构建流程通常分为两步:
- 生成构建文件:使用 Qt 的项目配置工具(
qmake或CMake)来读取你的.pro文件(或CMakeLists.txt),并生成一个平台特定的Makefile。 - 执行构建:使用
make命令来读取生成的Makefile,并执行编译、链接等操作。
你的命令行流程通常是:
qmake -> make
或者,对于现代 Qt 项目:
cmake -> make
使用 qmake 生成 Makefile 并用 make 构建
qmake 是 Qt 传统的构建工具,虽然现在 CMake 更推荐,但很多旧项目和简单项目仍在使用 qmake。

步骤 1: 生成 Makefile
确保你的项目目录中有一个 你的项目名.pro 文件(myapp.pro),在终端中进入该目录,运行 qmake 命令。
# 进入你的项目目录 cd /path/to/your/project # 生成 Makefile qmake
执行后,你会看到生成了一个新的 Makefile 文件,这个文件包含了所有编译和链接你的 Qt 应用程序所需的规则。
常用 qmake 选项:
-
-spec <spec>: 指定平台和编译器的规范文件,这通常在跨平台开发时需要。# 为 Linux/GCC 生成 Makefile qmake -spec linux-g++ # 为 Windows/MinGW 生成 Makefile qmake -spec win32-g++ # 为 macOS/Clang 生成 Makefile qmake -spec macx-xcode
-
Makefile: 指定生成的Makefile的名称。qmake -o MyCustomMakefile
-
project.pro: 指定要使用的.pro文件(如果文件名不是默认的)。qmake my_other_app.pro
步骤 2: 使用 make 进行构建
Makefile 生成后,就可以使用 make 命令来构建项目了。
# 基本构建命令 make
make 会自动执行 Makefile 中定义的默认目标(通常是 all),它会按顺序编译所有需要的源文件(.cpp),并将它们链接成最终的可执行文件。
常用 make 选项:
-j <jobs>: 并行编译,这是最常用的选项,可以极大地加快编译速度。<jobs>通常是你的 CPU 核心数。# 使用所有可用的 CPU 核心进行并行编译 make -j$(nproc) # Linux make -j$(sysctl -n hw.ncpu) # macOS # 或者直接指定一个数字 make -j8
clean: 清理编译过程中产生的所有中间文件(如.o文件)和最终的可执行文件。make clean
执行后,你需要重新运行
make来重新编译整个项目。install: 如果你的.pro文件中定义了target.path和INSTALLS,make install会将构建好的程序和依赖文件安装到指定目录。verbose或V=1: 显示详细的编译命令,便于调试。make V=1
完整示例
# 1. 创建并进入项目目录
mkdir my_qt_app && cd my_qt_app
# 2. 创建一个简单的 .pro 文件 (my_qt_app.pro)
echo 'QT += core gui widgets' > my_qt_app.pro
echo 'TARGET = my_qt_app' >> my_qt_app.pro
echo 'SOURCES += main.cpp' >> my_qt_app.pro
# 3. 创建一个简单的源文件 (main.cpp)
echo '#include <QApplication>' > main.cpp
echo '#include <QLabel>' >> main.cpp
echo '#include <QVBoxLayout>' >> main.cpp
echo '#include <QWidget>' >> main.cpp
echo '' >> main.cpp
echo 'int main(int argc, char *argv[]) {' >> main.cpp
echo ' QApplication app(argc, argv);' >> main.cpp
echo '' >> main.cpp
echo ' QWidget window;' >> main.cpp
echo ' window.setWindowTitle("Hello, Qt!");' >> main.cpp
echo ' window.resize(300, 200);' >> main.cpp
echo '' >> main.cpp
echo ' QLabel *label = new QLabel("Hello, World!");' >> main.cpp
echo ' QVBoxLayout *layout = new QVBoxLayout;' >> main.cpp
echo ' layout->addWidget(label);' >> main.cpp
echo ' window.setLayout(layout);' >> main.cpp
echo '' >> main.cpp
echo ' window.show();' >> main.cpp
echo ' return app.exec();' >> main.cpp
echo '}' >> main.cpp
# 4. 生成 Makefile
qmake
# 5. 使用 8 个核心并行编译
make -j8
# 6. 运行程序
./my_qt_app
使用 CMake 和 make (现代 Qt 开发方式)
从 Qt 5.0 开始,Qt 官方开始推荐使用 CMake 作为主要的构建系统,CMake 更强大、更灵活,并且能更好地处理复杂的项目和跨平台构建。
步骤 1: 生成构建文件
你需要一个 CMakeLists.txt 文件,然后使用 cmake 命令来生成 Makefile。
# 创建一个名为 build 的构建目录 (推荐) mkdir build && cd build # 运行 cmake,指定 CMakeLists.txt 所在的父目录 cmake ..
cmake 会分析 CMakeLists.txt,并生成 Makefile(在 Linux/macOS 上)或 Visual Studio 项目文件(在 Windows 上)。
常用 cmake 选项:
-DCMAKE_PREFIX_PATH=/path/to/qt: 非常重要! 告诉 CMake 去哪里找 Qt 的库和头文件,如果你的 Qt 安装在非标准路径,必须指定此选项。-G "Unix Makefiles": 显式指定生成器为 Unix Makefiles(在 Linux/macOS 上默认如此)。-DCMAKE_BUILD_TYPE=Release: 指定构建类型(Release或Debug)。Debug模式会包含调试信息,不进行优化;Release模式会进行优化,不包含调试信息。
步骤 2: 使用 make 进行构建
与 qmake 生成的 Makefile 一样,你可以使用 make 来构建。
# 在 build 目录中执行 make
同样,make -jN 和 make clean 等选项也完全适用。
CMake 完整示例
假设你的项目结构如下:
my_modern_app/
├── CMakeLists.txt
└── src/
└── main.cpp
CMakeLists.txt:
cmake_minimum_required(VERSION 3.16) project(MyModernApp VERSION 1.0 LANGUAGES CXX) # 设置 C++ 标准 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 查找 Qt 包 find_package(Qt6 COMPONENTS Core Widgets REQUIRED) # 添加可执行文件 add_executable(MyModernApp src/main.cpp) # 链接 Qt 库 target_link_libraries(MyModernApp PRIVATE Qt6::Core Qt6::Widgets)
构建命令:
# 1. 进入项目根目录 cd /path/to/my_modern_app # 2. 创建并进入构建目录 mkdir build && cd build # 3. 运行 cmake (假设 Qt 安装在 /opt/Qt/6.5.0/gcc_64) cmake -DCMAKE_PREFIX_PATH=/opt/Qt/6.5.0/gcc_64 .. # 4. 并行编译 make -j8 # 5. 运行程序 ./MyModernApp
总结与对比
| 特性 | qmake |
CMake |
|---|---|---|
| 项目文件 | .pro 文件 (简单,Qt 专用) |
CMakeLists.txt (通用,功能强大) |
| 适用场景 | 简单的 Qt 项目,快速上手 | 复杂项目,跨平台项目,非 Qt C++ 项目 |
| 平台支持 | 良好 (Qt 生态系统内) | 极佳 (几乎所有平台和构建器) |
| 社区与生态 | Qt 社区 | 极其庞大,工业标准 |
| 推荐度 | 旧项目或极简项目 | 现代 Qt 开发的首选 |
- 如果你正在维护一个旧的 Qt 项目,或者是一个非常简单的学习项目,使用
qmake->make是完全可以的。 - 对于任何新的、严肃的、或可能变得复杂的 Qt 项目,强烈建议使用 CMake,它为你提供了更好的可维护性、跨平台能力和更强大的构建配置选项。
无论使用哪种工具,最终的编译和链接步骤都是由 make 完成的,所以理解 make 的基本用法(特别是 -j 并行编译和 clean)是非常有用的。
