Bootstrap

windows下 CMake+MinGW 搭建C/C++编译环境

CMake

下载地址:https://cmake.org/download/

下载zip版本“cmake-3.xx-win64-x64.zip”,下载完成解压到指定目录并添加bin所在目录到环境变量。

在终端输入“cmake --help”或 “cmake --version”查看是否配置成功。


MinGW-w64

下载地址:https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/

推荐下载 离线版本“x86_64-posix-seh

将下载文件解压到指定目录并将bin目录加入到环境变量, 例如c:\mingw64\bin

将mingw64\bin目录下的“mingw32-make.exe”复制一份并改名为 “make.exe”,就可以在终端直接使用 “make”指令而不必使用“mingw32-make”指令。

在终端输入 “gcc -v”(或输入“make -v”查看版本信息),看到输出含以下信息,表示MinGW配置成功:

Thread model: posix
gcc version 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)

 

编译示例

新建src目录,创建main.cc文件

#include <iostream>

int main(){
    std::cout<<"Hello World!"<<std::endl;
    system("pause");
    return 0;    
}

编写CMakeLists.txt文件

cmake_minimum_required(VERSION 3.15)
project (HELLO)
set(SOURCE main.cc)
add_executable(${PROJECT_NAME} ${SOURCE})

(cmake中命令不区分大小写,变量区分大小写)

生成Makefile文件

mkdir build
cd build
cmake -G “MinGW Makefiles” ..

编译

make

运行

HELLO.exe



 

gcc、make、Makefile、CMake 与 CMakeLists

1. gcc(GNU Compiler Collection)可以看成是GNU编译器套件,可以编译C、C++、Objective-C、Java等多种编程语言。
当程序中只有很少个原文件时,可以直接使用gcc进行编译。但是当程序中包含很多个源文件时,使用gcc命令逐个文件编译的工作量很大且容易出错。
这时候就可以借助make工具进行“批量”编译和链接。


2. make本身不具有编译和链接的功能,而是类似于一个智能的批处理工具,通过调用Makefile文件中用户指定的命令进行编译和链接。


3. Makefile文件中定义了一套调用gcc编译源文件的命令。简单工程的Makefile文件可以手动编写,当工程比较大的时候手动编写Makefile文件也很麻烦,并且Makefile中的指令是平台相关的,换个平台还需要再修改。
这时候就可以使用CMake工具自动生成Makefile文件。


4. CMake工具可以以更加简单的方式自动生成Makefile文件,跨平台时只需要告诉CMake目标平台类型,就可以自动生成目标平台可使用的Makefile文件。
CMake依赖(或根据)CMakeLists.txt文件自动生成Makefile。


5. CMakeLists.txt需要手动编写。

 

CMake工具和CMakeLists.txt是一对好基友, make工具和Makefile是另一对好基友。
 

CMake要解决的问题是项目要在不同平台不同编译器下都可以依据一个统一的脚本(CMakeLists.txt)进行构建的问题。忽略不同平台的差异,抽象成为一个一致的环境。
make要解决的问题是在一个特定的平台环境上依据当前平台的脚本(Makefile),调用gcc(或其他编译器)对源文件进行批量编译链接的问题。

CMake是一个比make更高级的编译配置工具,它可以根据不同平台、不同的编译器,生成相应的Makefile,达到一个编写,多环境编译的效果。


所以使用CMake编写一个跨平台的工程的基本流程是:

  • 1. 编写代码源文件
  • 2. 编写CMakeLists.txt(依据CMake的语法规格和格式)
  • 3. 使用CMake工具根据CMakeLists.txt生成Makefile
  • 4. 使用make工具根据Makefile,调用gcc编译链接生成可执行目标文件

;