业务需要用到CMake和gtest框架,但我此前从来没接触过,就花时间整理了下,做了一个简单的cmake尝试。
前言我过去使用Java语言,就算用C++也是Dev C++ IDE,很少关注编译与构建的细节。只是大概知道:
- C++是编译型语言。cpp代码文件需要由编译器编译成exe二进制文件才能执行
- Java是编译解释性语言。java代码文件需要先编译成class文件,再由解释器放在jvm虚拟机里运行。
花时间学习CMake确实有助于我理解很多底层的知识,特别是理解很多细节,这个教程会持续下去,但不一定每周都更新。
准备工作语法知识放一边,先来安装CMake和gcc。(以下的安装基于Windows)
gcc如果你电脑已经安装了Dev C++或者Visual Studio,你大概率有一个gcc在电脑里。
使用以下代码检查电脑的gcc环境:gcc -v
你应该能看出来,我电脑的gcc用的是新版Dev C++自带的 9.2.0,我电脑同时安装了VS 2022,这给我带来了不少麻烦,会在以后的教程里提及。
这个版本的Dev C++是国内作者的改版,链接:小龙 Dev-C++ 中文主页
如果你的电脑有MinGW环境添加环境变量即可,以我的为例,Dev C++自带的gcc在以下位置:D:\Program Files (x86)\Dev-Cpp\TDM-GCC-64
,这个目录下应该包含bin、include、lib等文件夹。
在环境变量-系统变量-Path里,加入bin文件夹所在的路径,如图:
如果你的电脑没有MinGW环境下载地址:MinGW
install,一路next。安装成功后打开MinGW Installation Manager,选择需要安装的版本(如果你不知道需要哪些就全选),点击菜单栏的Installation,点击Apply Changes,在d出的对话框里点击Apply,然后等待安装完成即可。
然后按照上面的配置环境变量。
顺便科普一下TDM-GCC和MinGW的信息
CMakeMinGW: 编译目标仅兼容 32 位应用程序,最新的官方二进制版本为 GCC 9.2.0。(OSDN)
MinGW-w64: 衍生自 MinGW 的项目,编译目标兼容 32 位应用程序与64 位应用程序,最新的官方二进制版本为 GCC 8.1.0。(SourceForge)
TDM-GCC: 衍生自 MinGW 和 MinGW-w64 的项目,分为 32 位与 64 位两个版本,32 位版本的编译目标仅兼容 32 位应用程序,64位版本的编译目标兼容 32 位应用程序与 64 位应用程序,最新的官方二进制版本为 GCC 10.3.0。
下载地址:Download | CMake
选择Windows x64的msi安装包,如下一路安装即可,记得为所有用户安装,以及配置path。
在PowerShell输入cmake --version
以检查CMake是否安装成功,如图
简单来说,gcc的确可以将源文件编译成exe文件,但文件一多,就需要一个编译顺序,利用构建(build)可以指定这种顺序,定义构建的文件被称为Makefile。
但是编写Makefile对于大型项目又比较复杂,通过CMake就可以使用更加简洁的语法定义构建的流程,CMake定义构建过程的文件为CMakeLists.txt。
cmake的一般流程为:
- 生成构建系统,对应的指令为
cmake
- 构建,对应的指令为
cmake --build
- 其他 *** 作,比如执行、测试等。
这个例子简单到,实际生产的时候,是绝对不会用这样的结构的。
目录结构如下:
cmakeTest
├─ CMakeLists.txt
└─ main.cpp
main.cpp
的代码如下。就是输出hello cmake,没什么意义。
#include
using namespace std;
int main(){
printf("Hello CMake!");
}
CMakeLists.txt
的结构比较重要:
# 项目所需最低Cmake版本
cmake_minimum_required(VERSION 3.12)
# 项目名称、版本、语言
project(cmaketest VERSION 1.0.0 LANGUAGES C CXX)
# 源文件与可执行文件
add_executable(helloc main.cpp)
生成构建系统
在项目根目录下执行
cmake -B build
结果如下:
很奇怪,这里用的是 VS 2022 的构建,没有用gcc的,这个问题留待以后解决,目前暂时保持现状不动。
同样在根目录,执行
cmake --build build
执行
可能由于使用 VS 的原因,我的可执行文件并没有在根目录生成。你可以自己寻找位置,这太奇怪了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)