【一学就会】(一)C++编译工具链——基于VSCode的CMake、make与g++简单理解与应用示例

目录

一、CMake、make与g++

1、名词辨析

2、孰优孰劣

二、应用示例

1、工具类安装与配置

1)VSCode安装与配置

2)CMake下载与安装

3)MinGW-W64下载与安装

A、科学上网法

B、无需科学上网法

4)VSCode推荐插件 

 A、c/c++编译环境配置

 B、Fitten Code

2、CMake使用示例

寄语:希望我能做到你不用动手就能获取使用经验

第一步 创建简单项目

A、新建并打开项目文件夹

B、新建所需文件

C、点击tutorial.cpp文件

D、点击CMakeLists.txt 文件

E、点击TutorialConfig.h.in文件

F、构建和运行

1)cmake不指定编译器

2)mingw32-make副本改名make

3)cmake指定Mingw编译器及各编译器参数

4)内部构建和外部构建

第二步 添加库

A、创建子文件夹和库文件

B、点击MathFunctions.h文件

C、点击mysqrt.h文件

D、点击MathFunctions.cpp文件

E、点击mysqrt.cpp文件

F、点击子CMakeLists.txt文件

G、点击顶层CMakeLists.txt文件

H、将库设为可选项

第三步 调教库

 第四步 安装与调试

A、安装法则

B、调试法则

第五步 设置系统日志和异常处理(系统内省)

第六步 添加自定义命令和生成文件

解释一 Table.h在哪里?

解释二 Table.h的内容是什么?为什么?

解释三 Table.h的名称和生成位置这么控制的?

第七步 创建安装包

第八步 添加dashboard支持

第九步 创建共享库

第十步 添加生成器表达式

第十一步 添加导出配置

第十二步 Debug和Release打包

3、g++使用教程

A、编译单个源文件并生成可执行文件program:

B、编译多个源文件并生成可执行文件program:

C、指定 C++ 编译版本生成可执行文件:

D、添加头文件和库文件的搜索路径:

E、生成调试信息:

F、启用警告并将视为错误:

全文完,共53250字。


一、CMake、make与g++

1、名词辨析

CMake、make与g++分别是项目构建生成工具、项目构建工具和项目编译链接工具的代表之一。他们的关系可以概括为由项目构建生成工具CMake生成项目构建工具make所需的文件,项目构建工具make利用这些文件编译链接项目;而项目编译链接工具g++可以独立完成项目构建生成工具CMake和项目构建工具make的工作。

所谓Makefile文件,即是make编译、链接的规则性说明文件,作用相当于CMakeLists.txt之于CMake.

2、孰优孰劣

  • 既然g++可以完成CMake和make两人的工作,为什么不直接使用g++?

因为直接使用g++的话,面对复杂的工程,多项目、多参数和各种依赖关系,命令代码是很复杂的,而且难以理清工程各种源文件之间的编译顺序,不便于项目管理与维护。对于简单项目,g++自然可以应付的来了。

  • make也可以独立完成项目的编译和链接,为什么还需要CMake的帮助?

一句话,CMake的出现就是为了简化和升华make的工作的。Makefile的编码更加严格,语法规则更加复杂,况且Makefile针对不同的操作系统和编译器,编写内容是不同的,平台移植性差。CMake能够更改好的跨平台。一般地说,支持跨平台的原因是有自己独立运行的机制、检测不同平台的能力和针对不同平台生成对应对象的能力。当然,再能够支持第三方库和工具,则更具有可扩展性。CMake便是如此。他使用一套抽象的编译器和操作系统,能够检测不同的操作系统和编译器,并针对它们生成对应的Makefile文件。同样,CMake支持第三方库和工具。这样,便更有利于开发。

二、应用示例

1、工具类安装与配置

1)VSCode安装与配置

这个不要多说,推荐使用免安装版,因为安装版不可选安装路径,占据C盘空间。

官网:Download Visual Studio Code - Mac, Linux, Windows

2)CMake下载与安装

官网:Download CMake

版本:安装版可以自动环境变量配置。

安装步骤:

第一步,直接next

 第二步,agree,继续next

 第三步,选择加入系统环境变量,方便起见,为所有用户安装,无需创建桌面图标。

 第四步,改变安装路径,继续next

 第五步,install,等待安装完成。

第六步,验证。win键唤出开始菜单,敲cmd,打开控制台,输入

cmake -version

3)MinGW-W64下载与安装

说明:MinGW-W64就是充当make的工具,对应于Linux的make构建工具,作用基本相同。在下文会说明使用CMake指定生成MinGW编译器的makefile文件。

官网:MinGW-w64

版本:这里我们直接下载mingw-w64,其他工具不做多介绍。主页点击Downloads。

 可以看到由很多版本可以选择,我们直接选择右侧sources

 选择SourcesFrogs,下载最新版本就好。

点击files栏

A、科学上网法

下拉之后,选择在线安装程序,点击下载之后,跳转等5秒即可开始下载,下载可能有点慢,稍等即可。

第一步,next

 

 第二步,做出如下选择

 version:版本选最新的

Architecture:系统架构,64位选择x86_64;32位选择i686

Threads:Windows系统选择win32;跨平台系统选择posix

Exception:异常处理,不管是32位还是64位的,sjlj都是比较老的,选择第一项最新的即可。

Build revision:没得选,0;若有得选,建议默认即可。

第三步,更改安装位置,选择创建开始菜单。然后科学上网,再点next,等待安装完成。

B、无需科学上网法

在线安装程序的下方,就是各种离线包。依据:

 version:版本选最新的

Architecture:系统架构,64位选择x86_64;32位选择i686

Threads:Windows系统选择win32;类Unix系统选择posix

Exception:异常处理,不管是32位还是64位的,sjlj都是比较老的,选择第一项最新的即可。

Build revision:没得选,0;若有得选,建议默认即可。

我的话,就选择x86_64-win32-seh这一项,等待下载完成。

下载完成解压提取文件到新建的文件夹下。建议简化解压目录,剪切mingw64到外层文件夹即可。

设置系统环境变量。

win键唤起开始菜单,输入环境变量,打开编辑系统环境变量。

 

双击path,新建->浏览,

定位到解压目录即可。 

验证:win键唤起开始菜单,输入cmd,输入代码,g++也可以。

gcc -v

 弹出版本信息。输入代码

where gcc

显示安装位置。

这样一来,我们已经可以使用cmake和make来编译我们的项目啦。为了使VSCode更好使用,我们安装一些插件。 

4)VSCode推荐插件 

打开VSCode,快捷键F1,选择extension

 A、c/c++编译环境配置

扩展搜索框搜索:c/c++

安装C/C++ Extension Pack,会附带安装4个扩展,方便快捷。


 有一个设置弹窗,可以进行设置


显示在侧边栏,方便一些


 B、Fitten Code

这是一个类GitHub Copilot插件,可代码补全、代码解释、生成代码以及对话等。就是需要注册一个账号,介意的话,就不要使用了。

2、CMake使用示例

寄语:希望我能做到你不用动手就能获取使用经验

本教程有官方示例,可参阅网址:CMake Tutorial — Mastering CMake

官方文档虽然很正式,但是毕竟是全英文,而且不如结合VSCode实际操作来得直观。本教程还是有一定价值的。我们就参考着官网文档和源码从零开始一步一步展示cmake示例。

官网操作源码地址:CMake Tutorial — CMake 3.29.1 Documentation

点击如下链接即可。

第一步 创建简单项目

A、新建并打开项目文件夹

新建一个空白文件夹(无中文路径是基本默认的)作为我们项目文件夹,打开VSCode,打开文件夹。


B、新建所需文件

新建文件CMakeLists.txt、tutorial.cpp和TutorialConfig.h.in,注意后缀一起当文件名填上,文件大小写是敏感的,这样规范。

 


C、点击tutorial.cpp文件

输入代码

// A simple program that computes the square root of a number
#include <iostream>
#include <string>
#include "TutorialConfig.h"

#include "MathFunctions.h"

#include <math.h>

int main(int argc, char* argv[])
{
  if (argc < 2) {
    // report version
    std::cout << argv[0] << " Version " << Tutorial_VERSION_MAJOR << "."
              << Tutorial_VERSION_MINOR << std::endl;
    std::cout << "Usage: " << argv[0] << " number" << std::endl;
    return 1;
  }

  // convert input to double
  const double inputValue = std::stod(argv[1]);

  const double outputValue = mathfunctions::sqrt(inputValue);


  std::cout << "The square root of " << inputValue << " is " << outputValue
            << std::endl;
  return 0;
}


D、点击CMakeLists.txt 文件

输入代码

# 用于设定项目所需的最低 CMake 版本
cmake_minimum_required(VERSION 3.10)

# 设置项目名称和版本号
project(Tutorial VERSION 1.0)

# 设置c++标准为23
set(CMAKE_CXX_STANDARD 23)
# 设置c++标准为23时,要求编译器必须支持该标准
set(CMAKE_CXX_STANDARD_REQUIRED True)

# 设置文件,在构建项目时由前者生成后者。
configure_file(TutorialConfig.h.in TutorialConfig.h)

# CMake使用源文件 tutorial.cpp 创建一个名为 "Tutorial" 的可执行文件
add_executable(Tutorial tutorial.cpp)

# 设置头文件搜索路径
target_include_directories(Tutorial PUBLIC
                           "${PROJECT_BINARY_DIR}"
                           )

通俗点说

  • cmake_minimum_required()指定cmake的最低版本,低于指定版本就不行。
  • project()设定最后生成的可执行文件叫什么名字和目前的版本号。
  • set(CMAKE_CXX_STANDARD 23)设置c++标准为23
  • set(CMAKE_CXX_STANDARD_REQUIRED True)设置c++标准为23时,要求编译器必须支持该标准
  • configure_file(TutorialConfig.h.in TutorialConfig.h)设置文件,用于存放cmake的一些设置信息,在构建项目时由前者生成后者。后者默认存放于构建项目生成路径,因而,需要target_include_directories()设置项目包含的头文件所在的路径。
  • add_executable()指示编译哪些源文件,最后生成对应名称的可执行文件。若有多也不多个源文件,如两三个,则用空格隔开就行,如add_executable(mytest a.cpp b.cpp),即是编译a.cpp和b.cpp,生成mytest.exe的可执行文件。还可以这么做
  • set(SRC_LIST a.cpp b.cpp c.cpp)
    add_executable(${PROJECT_NAME} ${SRC_LIST})
  • set 命令指定 SRC_LIST 变量来表示多个源文件,用 ${ SRC_LIST} 获取变量的值。
  • target_include_directories()设置我们的项目应该在哪里找到构建项目的文件。下文会进行外部构建,生成的构建项目的文件将放在build文件夹中,cmake将会自动探测并定位到./build路径。.表示当前路径目录,..表示上一级路径目录。public即是构建文件的可见性为最高级,大家都能见到。


E、点击TutorialConfig.h.in文件

输入代码

// 定义宏,表示项目的版本号,由CMakeLists.txt文件中的set(Tutorial_VERSION_MAJOR 1)和set(Tutorial_VERSION_MINOR 0)命令设置。
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@

项目版本号的配置文件。一大一小。编译后,会在build构建文件下生成TutorialConfig.h头文件。

 


F、构建和运行

打开控制台,顶部栏Terminal->new Terminal,输入代码创建build文件夹

mkdir build


build文件夹将是我们cmake存放生成构建项目文件的文件夹。由 TutorialConfig.h.in文件通过cmake构建生成的TutorialConfig.h就将存放于此。上文

target_include_directories(Tutorial PUBLIC

                           "${PROJECT_BINARY_DIR}"

                           )

PROJECT_BINARY_DIR就将是./build文件目录。这由cmake自动完成探测。

然后,使用控制台cd到文件目录build。即是在当前目录更进一步到build目录。

cd build


1)cmake不指定编译器

 准备生成构建项目文件。

  • 此次构建未指定编译器。
  • Windows系统下,如果安装了Visual Studio,默认使用MSVC编译器。后续构建时使用MinGW编译器将会报错。
cmake ..

因为项目的顶级CMakeLists.txt 文件在当前文件目录build的上一级,所以是cmake ..,两个英文句号。一个英文句号.表示当前目录。目录下一定要有CMakeLists.txt 文件。


可以看到,生成的配置文件 TutorialConfig.h。当然,还没有进行编译。这将调用默认编译器进行编译。build不是我们新建的build文件夹哦。

cmake --build .

此时将对项目进行编译。

运行生成的可执行文件,位于./build/Debug文件夹下。

第一次运行控制台少了数字报错错误,看 tutorial.cpp代码即可知道为什么。./Debug/Tutorial 为可执行文件的路径。由于当前在bulid目录,因此用.代替即可。


2)mingw32-make副本改名make

若我们使用MinGW编译器编译文件,将会报错。

mingw32-make
  •  为什么是mingw32-make,而不是Linux常见的make?
  • 请打开mingw64的安装位置,可以找到mingw32-make.exe文件。我们就是使用它编译的。
  •  若想简单点,复制mingw32-make.exe文件,然后粘贴到当前文件夹,系统自动创建副本,然后改名为make.exe,就能使用make了。


3)cmake指定Mingw编译器及各编译器参数

下面我们删除build下的所有文件,使用cmake指定编译器进行生成MakeFiles构建文件。

cmake -G"MinGW Makefiles" ..
  • cmake命令,-G指定使用哪种编译器。MinGW编译器对应的值为“MinGW Makefiles”,同样的,两个英文句号..表示顶层CMakeLists.txt文件在上一级。
  • 其他编译器对应的值为(别问我怎么得到的,MinGW Makefiles打成了MinGW MakeFiles,说明大小写敏感)
  •   Visual Studio 17 2022        = Generates Visual Studio 2022 project files.
                                     Use -A option to specify architecture.
      Visual Studio 16 2019        = Generates Visual Studio 2019 project files.
                                     Use -A option to specify architecture.
      Visual Studio 15 2017 [arch] = Generates Visual Studio 2017 project files.
                                     Optional [arch] can be "Win64" or "ARM".
      Visual Studio 14 2015 [arch] = Generates Visual Studio 2015 project files.
                                     Optional [arch] can be "Win64" or "ARM".
      Visual Studio 12 2013 [arch] = Deprecated.  Generates Visual Studio 2013
                                     project files.  Optional [arch] can be
                                     "Win64" or "ARM".
      Visual Studio 9 2008 [arch]  = Deprecated.  Generates Visual Studio 2008
                                     project files.  Optional [arch] can be
                                     "Win64" or "IA64".
      Borland Makefiles            = Generates Borland makefiles.
      NMake Makefiles              = Generates NMake makefiles.
      NMake Makefiles JOM          = Generates JOM makefiles.
      MSYS Makefiles               = Generates MSYS makefiles.
      MinGW Makefiles              = Generates a make file for use with
                                     mingw32-make.
      Green Hills MULTI            = Generates Green Hills MULTI files
                                     (experimental, work-in-progress).
      Unix Makefiles               = Generates standard UNIX makefiles.
      Ninja                        = Generates build.ninja files.
      Ninja Multi-Config           = Generates build-<Config>.ninja files.
      Watcom WMake                 = Generates Watcom WMake makefiles.
      CodeBlocks - MinGW Makefiles = Generates CodeBlocks project files
                                     (deprecated).
      CodeBlocks - NMake Makefiles = Generates CodeBlocks project files
                                     (deprecated).
      CodeBlocks - NMake Makefiles JOM
                                   = Generates CodeBlocks project files
                                     (deprecated).
      CodeBlocks - Ninja           = Generates CodeBlocks project files
                                     (deprecated).
      CodeBlocks - Unix Makefiles  = Generates CodeBlocks project files
                                     (deprecated).
      CodeLite - MinGW Makefiles   = Generates CodeLite project files
                                     (deprecated).
      CodeLite - NMake Makefiles   = Generates CodeLite project files
                                     (deprecated).
      CodeLite - Ninja             = Generates CodeLite project files
                                     (deprecated).
      CodeLite - Unix Makefiles    = Generates CodeLite project files
                                     (deprecated).
      Eclipse CDT4 - NMake Makefiles
                                   = Generates Eclipse CDT 4.0 project files
                                     (deprecated).
      Eclipse CDT4 - MinGW Makefiles
                                   = Generates Eclipse CDT 4.0 project files
                                     (deprecated).
      Eclipse CDT4 - Ninja         = Generates Eclipse CDT 4.0 project files
                                     (deprecated).
      Eclipse CDT4 - Unix Makefiles= Generates Eclipse CDT 4.0 project files
                                     (deprecated).
      Kate - MinGW Makefiles       = Generates Kate project files (deprecated).
      Kate - NMake Makefiles       = Generates Kate project files (deprecated).
      Kate - Ninja                 = Generates Kate project files (deprecated).
      Kate - Ninja Multi-Config    = Generates Kate project files (deprecated).
      Kate - Unix Makefiles        = Generates Kate project files (deprecated).
      Sublime Text 2 - MinGW Makefiles
                                   = Generates Sublime Text 2 project files
                                     (deprecated).
      Sublime Text 2 - NMake Makefiles
                                   = Generates Sublime Text 2 project files
                                     (deprecated).
      Sublime Text 2 - Ninja       = Generates Sublime Text 2 project files
                                     (deprecated).
      Sublime Text 2 - Unix Makefiles
                                   = Generates Sublime Text 2 project files
                         
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值