1. 命令行编译
命令行编译是指直接在命令行中输入以下指令:
预处理:gcc -E main.c -o main.i
编译:gcc -S main.i -o main.s
汇编:gcc -c main.s -o main.o
链接:gcc main.o -o main
命令汇总:gcc main.c -o main
多文件一起编译:gcc main.c test.c -o main
直接在命令行通过指令来编译的缺点:
这种方法有两个缺点:1, 如果你不小心丢掉了编译指令(比如不小心关掉了terminal)或者换了一个电脑,你就得重新敲一遍编译指令;2,就算你只修改了某一个c文件,你也必须把所有的源文件全部重新编译一次,这个是非常耗时间的,也是完全没有必要的。
2. makefile编译
我们的项目可能会有很多很多的内容需要去进行编译,如何去进行组织成了一个大问题,比如让谁先编译,谁后编译,这时,我们就需要一个构建工具来帮助我们对程序的构建流程进行组织。
Make是最常用的构建工具,诞生于1977年,主要用于C语言的项目。但是实际上,任何只要某个文件有变化,就要重新构建的项目,都可以用Make构键。
要使用Make对我们的项目进行构建,我们需要先告诉Make我们的程序应该如何去进行构建,这时我们就要编写一下Makefile(直接创建名为makefile的文件即可)了:
我们只需要把需要执行的命令按照我们想要的顺序全部写到里面就可以了,但是需要遵循以下格式:
targets:prerequisites
command
- targets:构建的目标,可以是一个普通的标签、文件名称等
- prerequisites:前置条件,可以设定要求完成其他目标才能开始构建当前目标
- command:构建需要执行的命令
一个Makefile中可以有很多个目标,比如我们现在要分别编译main.cpp和test.cpp,那么就需要创建两个目标:
# 执行命令 mingw32-make.exe -f makefile
main.exe: test.o main.o # 目标1:构建最终的程序 依赖于目标2和3 # 链接
g++ test.o main.o -o main.exe
main.o: main.cpp # 目标2:编译源文件,前置要求有main.cpp 以下命令依次为# 预处理 # 编译 # 汇编
g++ -E main.cpp -o main.i
g++ -S main.i -o main.s
g++ -c main.s -o main.o
test.o: test.cpp # 目标3:编译源文件,前置要求有test.cpp 以下命令依次为# 预处理 # 编译 # 汇编
g++ -E test.cpp -o test.i
g++ -S test.i -o test.s
g++ -c test.s -o test.o
控制台结果:
命令执行的每一步都会详细打印出来,我们可以看到构建确实是按照我们的顺序在进行,并且成功编译出最终目标。
3. Cmake编译
CMake 入门-菜鸟笔记 (coonote.com)
CMake是一个开源、跨平台的工具系列,用于构建、测试和打包软件。它使用平台无关的配置文件来控制软件编译过程,并生成可在所选编译器环境中使用的项目文件。这使得熟悉某个集成开发环境(IDE)的开发者可以用标准的方式构建他们的软件,这种可以使用各平台的原生构建系统的能力是CMake和其他类似系统的区别之处。
CMake的组态档取名为CMakeLists.txt,并不直接构建出最终的软件,而是产生标准的构建档,然后再依照一般的构建方式使用。
虽然使用Make可以很方便地对项目构建流程进行配置,但是貌似CLion并没有采用这种方式来组织我们的项目进行构建,而是使用了CMake,我们来看看它又是做什么的。
CMke是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。他能够输出各种各样的makefile或者oroject.文件,能测试编译器所支持的C++特性,类似UNⅨ下的automake.
简而言之,CMake是一个跨平台的Makefile生成工具!
实际上当我们创建一个项目后,CLion会自动为我们配置CMake,而具体的配置都是写在CMakeList.txt中的:
cmake_minimum_required(VERSION 3.25)
project(c01_c__)
set(CMAKE_CXX_STANDARD 11)
add_executable(c01_c__ main.cpp main.cpp test.cpp)
我们逐行来进行解读:
- 第一行使用cmake_minimum_required来指定当前项目使用的CMake最低版本,如果使用的CMakei程序低于此版本是无法构建的。
- 第二行project:指定项目名称,名称随意,后面的是项目使用的语言,这里缺省(C++).
- 第三行set用于设定一些环境变量等,这里设定的是C++11标准。
- 第四行add executable用于指定一个编译出来的可执行文件,这里名称为c01_c__,后面的都是需要编译的源文件(头文件可以不写)
当然除了这些语法之外,还有各种各样的设定,比如设定库目录或是外部动态连接库等,这里就不多说了,感兴趣的可以自行了解。
手动执行cmake需要配置一下环境变量,这里是win中的cmake:
添加完成后重启CLion,我们输入cmake命令进行生成:
cmake -S . -B test -G “MinGW Makefiles”
其中-S
后面的是源文件目录,这里.
表示当前目录,-B
后面是构建目录,一会构建的文件都在这里面存放,最后-G
是选择生成器(生成器有很多,甚至可以直接生成一个VS项目,我们可以直接使用Visual Studio打开),这里我们需要生成Makefile,所以填写"MinGW Makefiles"。
当然CLion并没有使用Makefile的编译方式,而是Ninja,并且生成的构建文件默认存放在cmake-build-debug中,跟make比较类似但是速度会更快一些,不过最后都会成功构建出我们的可执行程序。