1.MinGW 8.1.0版本

安装MinGW下载地址:https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/
在这里插入图片描述
下载最新的8.1.0版本:

在这里插入图片描述
下载后解压压缩包,配置环境变量,右击”此电脑”→属性→高级系统设置→环境变量。
在这里插入图片描述
在Path中添加MinGW bin路径:D:\C_Language_Development\MinGW\bin(读者选择自己的安装路径)。
在这里插入图片描述
在Windows下打开cmd运行gcc -v命令可以看到gcc version 8.1.0版本。
在这里插入图片描述打开MinGW的bin目录,复制一份mingw32-make.exe程序重命名为make,为了在开发中方便运行Makefile文件执行make命令。
在这里插入图片描述
因为make与gcc在同一个目录下面,所以make与gcc可以使用同一个环境变量配置,在cmd中执行make -v命令,可以看到make环境也配置完成。
在这里插入图片描述

2.Makefile

入门教学来自:
在这里插入图片描述
视频教学地址:https://www.bilibili.com/video/BV188411L7d2/?spm_id_from=333.337.search-card.all.click&vd_source=0c25fb1d0385a060ebc9e30df4602ff9
Makefile可以很方便的管理大量的C/C++代码编译成可执行文件。
在学习Makefile的使用方法之前需要预先准备几个样例代码:
main.cpp

	#include <iostream>
	#include "functions.h"
	
	int main() {
	    std::cout << "Hello, World!" << std::endl;
	    sayHello();
	    return 0;
	}

functions.h

	#ifndef JDK_12_FUNCTIONS_H
	#define JDK_12_FUNCTIONS_H
	void sayHello();
	#endif

sayHello.cpp

	#include <iostream>
	#include "functions.h"
	
	void sayHello(){
	    std::cout << "Hello, Computer!" << std::endl;
	}

在CLion中新构建一个Project:
在这里插入图片描述
在项目中写入上述样例代码
在这里插入图片描述

1. Version 1

基本语法:目标:依赖
Makefile(注意TAB空格):

	#VERSION 1
	#生成目标 需要依赖于文件
	hello: main.cpp sayHello.cpp
	#使用命令(TAB空格符号开头)
	   g++ -o hello main.cpp sayHello.cpp

这里的含义是:需要生成hello的目标文件,生成这个目标文件需要依赖main.cpp和sayHello.cpp两个文件。第二行代码表示需要完成这个需求执行的命令,在开头处需要一个TAB的空格符号
执行make命令默认寻找当前目录下名称为Makefile的文件执行程序,如果没有Makefile名称的文件,需要指定执行的文件名:

	make -f 执行文件名

在控制台执行make命令时,make程序会去找代码中指定的hello文件,如果没有hello文件就会执行g++命令生成hello文件。
在控制台执行make命令:
在这里插入图片描述
执行make命令后在目录下生成了一个hello.exe可执行文件。
在这里插入图片描述
执行hello.exe输出代码中编写的结果。
在这里插入图片描述
再次执行make时,由于代码编译后没有修过,make命令将不会重复编译文件,节约了编译时间。如果修改了编译前的代码,再次执行make命令后会再次编译一遍。make语法的第一版本每次重新编译都需要将所有的命令都执行一遍比较耗时,于是推出了第二版语法规则。

2. Version 2

make语法版本二中新增了变量定义语法,为编辑脚本提供了方便。
Makefile(注意TAB空格):

	#VERSION 2
	CXX = g++
	TARGET = hello
	OBJ = main.o sayHello.o
	
	$(TARGET): $(OBJ)
	   $(CXX) -o $(TARGET) $(OBJ)
	main.o: main.cpp
	   $(CXX) -c main.cpp
	sayHello.o: sayHello.cpp
	   $(CXX) -c sayHello.cpp

$表示调用定义的变量,语法格式与含义与版本1相同,只是在语法中增加了变量的定义,使用起来更加的灵活了。
执行meke命令同样会在当前目录下生成hello可执行文件,与第一版语法不同的是,此时如果只对其中一个文件(sayHello.cpp)做了修改,make重新编译时只会编译修改过的文件,大大节约了资源。
在这里插入图片描述

3. Version 3

make语法的第三个版本中新增了@、^与%语法符号,减少了执行命令的语法长度,在编译庞大的代码时减少了编写脚本的工作量,同时使语法看上去简洁了不少。
@:表示最终要生成的目标名称。
^:表示依赖代码,冒号后面的部分(全部依赖部分)。
<:表示依赖代码,冒号后面依赖的第一个。
%:表示规则,make会根据上下文去推断%所表示的代码,有点类似正则的概念。
Wall:显示所有的编译警告。

	#VERSION 3
	#变量
	CXX = g++
	TARGET = hello.exe
	OBJ = main.o sayHello.o
	#编译选项 -Wall:显示所有的编译警告
	CXXFLAGS = -c -Wall
	
	$(TARGET): $(OBJ)
	   $(CXX) -o $@ $^
	#所有.o结尾的目标文件需要.cpp结尾的文件去生成
	%.o: %.cpp
	#-c命令执行后接着执行-o命令生成TARGET文件
	   $(CXX) $(CXXFLAGS) $< -o $@
	#定义一个永远不会生成的目标文件,执行依赖clean命令,方便执行定义的clean命令,防止产生歧义。
	.PHONY: clean
	#定义目标cleam命令,执行删除命令(也可以定义其它命令格式)
	clean:
	   del -f *.o $(TARGET)

1)执行make命令:

2)修改sayHello.cpp文件

	#include <iostream>
	#include "functions.h"
	
	void sayHello(int in){
	    int i = in;
	    std::cout << "Hello, Computer!" << std::endl;
	}

执行make命令发现报错了:
在这里插入图片描述
sayHello.cpp代码中定义了未使用的变量i,这是因为这个报错是一个级别很低的警告,一般情况下是可以忽略的。但是,在编写Makefile时定义了一个编译选项-Wall,它表示显示所有的编译警告,于是这次执行make命令时报错了。
去除变量i后,重新执行make命令:
在这里插入图片描述
3)执行定义的clean功能,定义clean:表示执行make得到目标clean,没有依赖,直接执行命令:del -f *.o $(TARGET)删除所有.o后缀文件与目标文件hello。.PHONY: clean表示定义一个永远不会生成文件的目标,这里是为了防止已经存在名称为clean的文件导致执行clean目标时会显示目标文件已经存在。
在这里插入图片描述
执行clean功能后,会删除目录下的.o与hello文件。在windows系统下执行时,目标文件hello需要把后缀.exe也写上,在Linux系统中执行需要将del命令改为rm命令。
在这里插入图片描述
执行完成后,.o与hello文件都被删除了。
在这里插入图片描述

4. Version 4

make语法的第三个版本新增cpp文件时,需要手动在Makefile文件中添加新的文件名,仍然不是很便捷,于是make第四版本新增cpp文件时不再需要在Makefile文件中手动添加。
Makefile(注意TAB空格):

	#VERSION 4
	CXX = g++
	TARGET = hello.exe
	#当前目录下所有.cpp文件
	SRC = $(wildcard *.cpp)
	#.cpp文件生成.o文件,依赖源文件SRC
	OBJ = $(patsubst %.cpp, %.o, $(SRC))
	
	CXXFLAGS = -c -Wall
	
	$(TARGET): $(OBJ)
	   $(CXX) -o $@ $^
	%.o: %.cpp
	   $(CXX) $(CXXFLAGS) $< -o $@
	
	.PHONY: clean
	clean:
	   del -f *.o $(TARGET)

3.CMakeList

Makefile在不同的操作系统下有着不同的规范标准,执行的Makefile文件也千差万别,这样就带来一个严重的问题,如果软件想要跨平台,必须要保证能够在不同的平台都能编译。如果使用make工具就需要多次重复编写Makefile文件,这是一项让人抓狂的工程。
CMake就是针对上面问题所设计的工具:它首先允许开发者编写一种平台无关的,CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化Makefile和工程文件,从而做到“Write once, run everywhere”,显然,CMake是一个比make更高级的编译配置工具。
当多人使用不同的语言或编译器开发同一个项目,最终要输出一个可执行文件或者共享库时,就出现了CMake!

CMake下载地址:Download | CMake(下文使用的是3.26.0版本,CLion 2022建议使用2.8.11-3.24.x的CMake版本)。

这里下载cmake-3.26.0-rc3-windows-x86_64.zip,配置好环境变量D:\Microsoft_C_Development\cmake\bin。
在这里插入图片描述
入门教学来自:
在这里插入图片描述
视频教学地址:https://www.bilibili.com/video/BV1bg411p7oS/?spm_id_from=333.999.0.0&vd_source=0c25fb1d0385a060ebc9e30df4602ff9

样例代码复用Makefile中的样例代码。
CMake默认识别CMakeList.txt文件执行脚本,编写CMakeList.txt:

	#cmake最小支持版本
	cmake_minimum_required(VERSION 3.24)
	#标识project名称
	project(jdk_12)
	
	set(CMAKE_CXX_STANDARD 11)
	#在project名称的路径下生成hello文件,依赖于main.cpp sayHello.cpp
	add_executable(hello main.cpp sayHello.cpp)

执行cmake .命令会先查询配置属性:
在这里插入图片描述
Configuring done配置查询完毕,Generating done生成文件完毕。
执行完命令后生成了一些配置文件:
在这里插入图片描述
原本应该生成一个Makefile文件,但是这里在windows下并没有生成Makefile文件,在linux系统下就会生成Makefile文件,然会就可以执行Makefile文件对源码进行编译生成一个可执行文件。
在windows下解解决没有生成Makefile文件的问题,先删除刚刚生成的文件,然后执行cmake . -G "Unix Makefiles"命令:
在这里插入图片描述
执行完成后,在当前目录下就生成了我们想要的文件。
在这里插入图片描述
生成的Makefile文件中代码有200多行,这不是我们要讨论的重点,此时可以直接使用make命令对代码进行编译。
在这里插入图片描述
执行完make命令后在当前目录下就生成了我们所预期的可执行文件hello。
在这里插入图片描述
运行hello程序,可以看到可以正常运行。
在这里插入图片描述
这里有一个缺点,生成的CMake文件与源码在同一个目录下不方便管理。我们可以在当前目录下创建一个文件夹(build)专门存放CMake生成的文件。
进入build文件夹,执行CMake命令:

	cmake .. -G "Unix Makefiles"

这里使用了两个点号(.)表示当前目录的上一级,CMake命令会依赖当前目录的上一级生成CMake文件放入当前目录。
在这里插入图片描述
执行完命令后,新生成的文件就挂在build目录下面了。
在这里插入图片描述
使用make命令执行编译,运行hello程序,结果无误。
在这里插入图片描述

本文为作者(难拳)原创,转载请注明出处。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐