如何像Python一样编译C++代码

0. 简介

Python 作为一门解释型编程语言,对于人类十分友好,使用起来非常方便,但是计算机运行起来比其它编译型语言慢很多。

C++ 作为一门编译型编程语言,与Python完全相反,对于人类十分不友好,使用起来非常不方便,但是计算机运行起来飞快。

比如,运行一个 Python 源代码文件时我们只需要在终端里使用下面这行命令:

py .\hello.py

运行效果:
在这里插入图片描述


而 编译一个 C++ 程序并运行我们可能需要以下命令:

在这里插入图片描述

我这里的源代码文件是用 UTF8 格式编码的,而中国 Windows 系统的终端默认是用 GBK 中文编码的,所以导致中文部分的源代码解析错误,打印出来是乱码(C++烦人问题的其中一个,我们后面会解决)
源码:

#include <iostream>
using namespace std;
int main()
{
    cout << "Hello, World!" << endl;
    cout << "你好, World!" << endl;
}

对于C++入门,或者是学习C++信奥算法的孩子们来说,这些编码、命令等非常烦人,为了在学习过程中更快的调试程序,我们可以通过一些配置让C++的编译运行过程 “像” Python一样方便

我们的最终目标是实现一行命令编译并运行:
在这里插入图片描述


1. 安装 Python 解释器 (管家)

本文只介绍Windows系统的安装方法,主要是想推荐一下最新的 Python Install Manager(pymanager)
在这里插入图片描述
下载页面:https://www.python.org/downloads/
如果你的页面是下面这样的,先别着急点击按钮
在这里插入图片描述

等它完全加载之后,应该会变成下面这样:
在这里插入图片描述

点击之后,浏览器会自动开始下载,下载之后是一个 .msix 文件
在这里插入图片描述

打开这个文件:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
这里有 pymanager 的命令介绍,大家可以自己阅读一下
比如,我们可以在终端 (PowerShell) 中输入 py list 查看当前已安装的Python解释器

py list

Win + X 快捷键打开菜单,里面有终端
在这里插入图片描述
如果电脑里有Python这里会显示具体版本,我这是没有安装的例子

输入 py install default 安装当前最新正式版 Python 解释器

py install default

在这里插入图片描述
安装完成:
在这里插入图片描述
输入 python 命令测试一下能否运行交互式python解释器
在这里插入图片描述
在这里插入图片描述
安装完毕,Ctrl + D 退出交互式Python
重新运行 py list 查看已安装Python
在这里插入图片描述

想要让解释器运行某个Python代码文件(模块),可以在该文件所在文件夹内打开终端,或者在终端中用命令将终端工作目录移动到目标文件夹 (不会的可以自行AI)

在这里插入图片描述
输入 py 加目标文件名,可以只写前几个字母,按 Tab 键系统会有补全提示
在这里插入图片描述
在这里插入图片描述
pymanager 会自动选择刚刚安装的Python解释器,解释并运行
运行结果:
在这里插入图片描述
全部安装完毕,可以关闭所有终端窗口啦


2. 安装 C++ 编译器

C++的编译器五花八门,各种历史版本、分支,新人了解起来十分麻烦,不像Python有一个官方,我这只分享其中一种编译器,大家也不用去网站下载了,有可能下载还要挂“梯子”,不然龟速下载。
我放在Gitee上了,版本是GCC15.2:https://gitee.com/LibraTennyson/file-sharing

MinGW全称:Minimal GNU Windows 极简版GNU编译器,给Windows用的。
就是把Linux上的GCC编译器,改成能在Windows系统上直接运行的一套工具包

GCC全称:GNU Compiler Collection GNU编译器集合

GNU是一个做开源软件的组织

GCC里包含了多种语言的编译器:

  • gcc.exe 可以编译C语言
  • g++.exe 可以编译C++语言

在这里插入图片描述
在这里插入图片描述

下载后把这个压缩包放在一个自己记得住的文件夹内
比如放在一个叫 C++编译器 的文件夹内,这个文件夹的位置别忘了在哪

然后创建一个名为 mingw_x86_64-15.2.0 的空文件夹,待会编译器会放在里面
文件名是为了帮助以后回忆起来这个编译器的版本
(C++的编译器版本不像Python的版本那么好区分)
在这里插入图片描述
解压我们下载的压缩包,这个压缩包里面有一个叫 mingw64 的文件夹
(如果你用的是WinRAR,选择解压到当前文件夹即可)

mingw64 文件夹拖到我们刚刚创建的 mingw_x86_64-15.2.0 文件夹中

进入 mingw64bin 文件夹找到 g++.exe
在这里插入图片描述

选中它,然后按 Ctrl + Shift + C 快捷键保存文件路径

Win + X ,在弹出菜单中点击 系统
在设置页面中点击高级系统设置
在这里插入图片描述
点击环境变量
在这里插入图片描述

找到系统变量里的Path,双击打开:
在这里插入图片描述
新建:
在这里插入图片描述
然后按下 Ctrl + V 粘贴刚刚复制的路径即可,如果没有,可以回去重新复制一下路径
在这里插入图片描述
可以把最后的g++.exe这个部分删了,因为bin文件夹里有很多程序,这样以后这个文件夹里的程序都可以直接用名字调用了
在这里插入图片描述
我们打开一个终端,输入 g++ --version,看看能否使用 g++.exe

g++ --version

可以看到,显示信息和我们下载的版本一致
在这里插入图片描述
C++的编码问题我们还没解决,这里暂时不演示编译代码,g++命令配置完成即可


3. 安装IDE

1、Dev C++:https://gesp.ccf.org.cn/101/1002/10032.html
2、Zed:https://zed.dev
3、TRAE:https://www.trae.cn/ 注意是下载TRAE IDE哦

Dev C++我就不多说了,C++少儿编程考试和比赛都指定这个软件
但是Dev C++太老了,代码提示几乎为0,视觉观感也不好,看久了眼睛不舒服,代码折叠等辅助功能也不完善
除了考试的时候忍忍,考前模拟熟悉一下,平时还是用其它IDE练习更方便

Zed 是用 Rust 编程语言编写的,运行起来十分流畅,代码辅助功能十分完善,而且可以一键关闭所有AI功能,在练习时可以不被AI补全功能打扰

TRAE就是纯AI IDE了,强依赖AI的项目可以用它

大家自己研究研究怎么安装哈,我就不详细介绍了


4. Zed 项目配置

我们可以在桌面新建一个文件夹叫 AlgorithmPractice
以后做算法练习时可以把代码都放在这个文件夹里
我们打开 Zed,先打开设置
在这里插入图片描述
我们先把AI关了
在这里插入图片描述

打开文件夹,选择你刚刚创建的文件夹
在这里插入图片描述

在左侧工作目录下右键,新建文件,输入文件名 C++_UTF8.cpp
在这里插入图片描述

编写代码:

#include <iostream>
using namespace std;
int main()
{
    cout << "hello, world" << endl;
    cout << "你好,world" << endl;
}

Ctrl + J 快捷键在 Zed 内打开终端
在这里插入图片描述
输入命令:

 g++ .\C++_UTF8.cpp -o main

运行结束后我们可以在左侧目录下看到,多了一个main.exe文件
在这里插入图片描述
继续输入命令:

.\main.exe

正常情况下,中文部分会输出乱码
前面也提到过,Zed默认文件编码都是UTF8格式,而中国Windows系统的终端默认编码格式是GBK格式
在这里插入图片描述

4.1 终端格式

我的终端格式这个样子是设置过的
在这里插入图片描述
默认的格式应该是在一行的,我设置之后路径和命令分为两行显示
接下来我讲讲怎么设置

在终端中输入 zed $PROFILE,会用 Zed 打开PowerShell配置文件
(输入zed $PR 然后按Tab键会有补全提示)
在这里插入图片描述
在文件中输入以下代码

# 自定义提示符格式
function prompt {
    # 显示当前路径,然后换行,再显示 > 符号
    "$(Get-Location)`n> "
}

Ctrl + S 保存
关闭刚刚的终端,按 Ctrl + J 重新打开一个终端,现在就是更新后的格式

4.2 快速切换编码

刚刚由于我们的终端是GBK格式,所以运行UTF8格式的代码时,中文部分是乱码
我们在配置文件中添加以下代码

# 开机默认UTF8编码,永久设置控制台代码页UTF8
chcp 65001 | Out-Null
# 同步PowerShell管道输出编码,解决C++程序中文乱码
$OutputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8


# 一键切UTF8
function Set-UTF8 {
    chcp 65001 | Out-Null
    $OutputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
    Write-Host "已切换终端编码:UTF-8 (65001)" -ForegroundColor Cyan
}

# 一键切GBK
function Set-GBK {
    chcp 936 | Out-Null
    $OutputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::Default
    Write-Host "已切换终端编码:GBK (936)" -ForegroundColor Yellow
}

这段代码可以让终端每次启动时自动切换为UTF8编码格式
如果想要切换也可以使用Set-GBKSet-UTF8来快速设置编码格式

同样的,保存文件,关闭终端,重新打开终端
你可以在终端中运行一下Set-GBKSet-UTF8命令,你会发现乱码
在这里插入图片描述
这是因为,我们刚刚用 zed $PROFILE 的时候系统自动新建的配置文件为UTF8格式
要想正常显示中文我们得用 UTF-8-BOM 格式保存
我们先找到这个配置文件的位置
在这里插入图片描述
Microsoft.PowerShell_profile.ps1 这个文件用Windows记事本打开
点击另存为
保存时,类型选所有,编码格式选UTF-8 BOM,文件名和之前保持一直,提示文件已存在,确认替换
在这里插入图片描述

保存之后,重新打开终端再运行Set-GBKSet-UTF8命令就都正常了
在这里插入图片描述
在这里插入图片描述
我们切换为UTF8格式然后重新运行一下我们之前编译的main.exe文件
在这里插入图片描述
现在就能正常运行UTF8格式的C++代码了

4.3 简化编译运行命令

我们之前C++的命令分为两行,一行编译,一行运行编译生成的exe文件

g++ .\C++_UTF8.cpp -o main
.\main.exe

我们要通过添加PowerShell配置实现一行命令完成编译、运行

g++ .\C++_UTF8.cpp

只需要继续在PowerShell配置文件中添加下面代码

function g++ {
    # ========== 新增:快速透传判断(非编译运行场景直接调用原生g++) ==========
    $passThroughArgs = @('--version', '--help', '-v', '-c', '-E', '-S', '-MM', '-M')
    $shouldPassThrough = $false

    foreach ($arg in $args) {
        if ($passThroughArgs -contains $arg) {
            $shouldPassThrough = $true
            break
        }
    }

    # 命中透传规则:原封不动调用原生g++.exe,直接返回
    if ($shouldPassThrough) {
        g++.exe @args
        return
    }
    # ==========================================================================

    $outName = "main"
    $userSpecifiedOut = $false
    $newArgs = @()

    # 解析参数,找出用户是否指定了 -o
    for ($i = 0; $i -lt $args.Count; $i++) {
        $arg = $args[$i]
        if ($arg -eq "-o" -and $i+1 -lt $args.Count) {
            $outName = $args[$i+1]
            $userSpecifiedOut = $true
            $i++  # 跳过文件名参数
            # 不把 -o 和文件名加入 $newArgs
        } else {
            $newArgs += $arg
        }
    }

    # 构建传给 g++.exe 的参数
    if (-not $userSpecifiedOut) {
        # 用户未写 -o,自动添加 -o main.exe
        $finalArgs = @("-o", "main.exe") + $newArgs
    } else {
        # 用户已写 -o,保留原样
        $finalArgs = @("-o", $outName) + $newArgs
    }

    # 执行编译(启用 C++11)
    g++.exe -std=c++11 @finalArgs

    # 若编译成功,运行生成的程序
    if ($LASTEXITCODE -eq 0) {
        Write-Host "`n编译成功,正在运行..." -ForegroundColor Green
        if ($userSpecifiedOut) {
            # 自动添加 .exe 后缀(如果用户指定的输出名不含 .exe)
            $runExe = if ($outName -match '\.exe$') { $outName } else { "$outName.exe" }
            & ".\$runExe"
        } else {
            # 默认输出 main.exe 位于当前目录
            & ".\main.exe"
        }
    } else {
        Write-Host "`n编译出错,程序未运行" -ForegroundColor Red
    }
}

现在我们执行g++指令就可以直接编译并运行了

g++ .\C++_UTF8.cpp

记得重启终端
在这里插入图片描述
具体什么原理,大家可以复制给AI让AI给你解读
(本来我也是让AI写的)

这个PowerShell配置文件是对所有终端生效的,哪怕不开启IDE,直接在终端中也可以使用我们设置的这些特性
完整配置代码:

# 本文件现在用 UTF-8 with BOM 编码

# 自定义提示符格式
function prompt {
    # 显示当前路径,然后换行,再显示 > 符号
    "$(Get-Location)`n> "
}

# 开机默认UTF8编码,永久设置控制台代码页UTF8
chcp 65001 | Out-Null
# 同步PowerShell管道输出编码,解决C++程序中文乱码
$OutputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8


# 一键切UTF8
function Set-UTF8 {
    chcp 65001 | Out-Null
    $OutputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
    Write-Host "已切换终端编码:UTF-8 (65001)" -ForegroundColor Cyan
}

# 一键切GBK
function Set-GBK {
    chcp 936 | Out-Null
    $OutputEncoding = [Console]::OutputEncoding = [System.Text.Encoding]::Default
    Write-Host "已切换终端编码:GBK (936)" -ForegroundColor Yellow
}


function g++ {
    # ========== 新增:快速透传判断(非编译运行场景直接调用原生g++) ==========
    $passThroughArgs = @('--version', '--help', '-v', '-c', '-E', '-S', '-MM', '-M')
    $shouldPassThrough = $false

    foreach ($arg in $args) {
        if ($passThroughArgs -contains $arg) {
            $shouldPassThrough = $true
            break
        }
    }

    # 命中透传规则:原封不动调用原生g++.exe,直接返回
    if ($shouldPassThrough) {
        g++.exe @args
        return
    }
    # ==========================================================================

    $outName = "main"
    $userSpecifiedOut = $false
    $newArgs = @()

    # 解析参数,找出用户是否指定了 -o
    for ($i = 0; $i -lt $args.Count; $i++) {
        $arg = $args[$i]
        if ($arg -eq "-o" -and $i+1 -lt $args.Count) {
            $outName = $args[$i+1]
            $userSpecifiedOut = $true
            $i++  # 跳过文件名参数
            # 不把 -o 和文件名加入 $newArgs
        } else {
            $newArgs += $arg
        }
    }

    # 构建传给 g++.exe 的参数
    if (-not $userSpecifiedOut) {
        # 用户未写 -o,自动添加 -o main.exe
        $finalArgs = @("-o", "main.exe") + $newArgs
    } else {
        # 用户已写 -o,保留原样
        $finalArgs = @("-o", $outName) + $newArgs
    }

    # 执行编译(启用 C++11)
    g++.exe -std=c++11 @finalArgs

    # 若编译成功,运行生成的程序
    if ($LASTEXITCODE -eq 0) {
        Write-Host "`n编译成功,正在运行..." -ForegroundColor Green
        if ($userSpecifiedOut) {
            # 自动添加 .exe 后缀(如果用户指定的输出名不含 .exe)
            $runExe = if ($outName -match '\.exe$') { $outName } else { "$outName.exe" }
            & ".\$runExe"
        } else {
            # 默认输出 main.exe 位于当前目录
            & ".\main.exe"
        }
    } else {
        Write-Host "`n编译出错,程序未运行" -ForegroundColor Red
    }
}

5. Dev C++的GBK格式

由于Dev C++读取和保存代码的格式就是GBK(因为我们是中文系统)
所以你其它编辑器写的代码(UTF8格式)用Dev C++打开,中文部分都是乱码
输出结果自然也是乱码
在这里插入图片描述
那如果有些时候想用Dev C++练习怎么办
可以用Dev C++新建一个文件,保存的时候在文件名中添加GBK后缀
显示的告诉自己,这个文件是GBK格式
在这里插入图片描述
Zed 能正常读取GBK格式的源代码
在这里插入图片描述
如果想在Zed中用终端运行代码,只要先Set-GBK,然后再用g++命令编译并运行即可
在这里插入图片描述


6. 使用 TRAE 转换文件编码格式

TRAE有很多很好用的功能,大家可以自己摸索
我在这里介绍一个
TRAE 默认打开文件的格式是UTF8
在这里插入图片描述
我们可以点击右下角的编码格式UTF-8
选择通过编码重新打开,可以选择GBK格式打开
现在就显示正常了
在这里插入图片描述
如果我们相把这个文件改变为UTF8格式编码
可以再点击右下角的编码格式,点击通过编码保存
TRAE 会重新写入文件,用新的编码格式保存
在这里插入图片描述
这样可以很方便的切换文件的编码格式,不用每次都另存为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值