CPP编译器安装(Windows环境)
编译器选择
一些常用的C++编译器:
- GNU Compiler Collection (GCC):
- GCC支持多种编程语言,包括C++,是一个免费开源的编译器套件,我们常用的是以下两种。
- GCC: C 语言编译器,也称为
gcc
- G++: C++ 语言编译器,也称为
g++
- GCC: C 语言编译器,也称为
- 它是许多Linux发行版的默认编译器,也可在其他操作系统上使用。
- GCC提供了丰富的优化选项和功能,适用于各种类型的C++项目。
- GCC支持多种编程语言,包括C++,是一个免费开源的编译器套件,我们常用的是以下两种。
- Clang:
- Clang是LLVM项目的一部分,也是一个免费开源的编译器。
- 它支持C、C++和Objective-C等语言,并提供了更快的编译速度和更好的错误报告。
- Clang的模块化架构使其易于扩展和集成到其他工具中。
- Microsoft Visual C++ Compiler:
- Microsoft Visual C++是Windows平台下的主要C++编译器。
- 它通常与Visual Studio集成,提供了丰富的开发工具和调试功能。
- Visual C++ Compiler也可以作为独立的编译器使用。
本文推荐使用GCC,当前区域赛用的应该都是GCC
使用MinGW或MSYS2安装GCC
- MinGW(Minimalist GNU for Windows)和MSYS2(Minimal SYStem 2)是在Windows上使用GCC的常用工具。
- MinGW提供了基本的开发工具,而MSYS2则提供了更丰富的Unix风格的环境和包管理器。
- 推荐使用MSYS2,因为它提供了更好的包管理和更新机制。
-
下载和安装MSYS2:
- 访问MSYS2的官方网站(https://www.msys2.org/)下载最新版本的安装程序。
- 运行安装程序,按照提示完成安装过程。安装完成后,会生成一个MSYS2的命令行窗口。
-
配置镜像源或代理
-
配置msys2清华镜像
-
打开你之前安装的路径找到
msys2\etc\pacman.d
可以看到mirrorlist.mingw32
、mirrorlist.mingw64
、mirrorlist.msys
三个文件。 -
在文件
mirrorlist.mingw32
中加入:Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/i686
-
在文件
mirrorlist.mingw64
中加入:Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/mingw/x86_64
-
在文件
mirrorlist.msys
中加入:Server = https://mirrors.tuna.tsinghua.edu.cn/msys2/msys/$arch
-
-
如果在之后的安装过程中还是感到卡顿出现连接失败的情况则需要配置代理
-
在
~\msys2\etc\profile.d
路径下添加文件proxy.sh
-
文件内容:
export http_proxy=%PROXY_SERVER%:%PROXY_PORT% export https_proxy=%PROXY_SERVER%:%PROXY_PORT%
注意里面要填的是自己的代理服务器和端口
-
-
-
更新包管理器:
-
打开MSYS2命令行窗口,执行以下命令更新包管理器:
pacman -Syu
-
-
安装GCC:
-
在MSYS2命令行窗口中,执行以下命令安装GCC:
pacman -S mingw-w64-x86_64-toolchain
-
这会安装GCC以及其他必要的工具链
-
如果学校OJ上有编译器也可以直接下载到本地解压即可(就不用装msys2了)
-
-
添加环境变量
将路径
~\msys2\mingw64\bin
(注意~为省略内容,准确来说是你安装的msys2中的mingw64里面的bin文件夹,如果是在OJ上下载的找到其中的\mingw64\bin
即可)添加至环境变量这篇博客讲解了如何添加环境变量以及环境变量的作用
-
验证安装:
-
安装完成后,可以在命令行窗口中运行以下命令验证GCC是否成功安装:
g++ -v
-
如果安装成功,将会显示G++的版本信息。
-
-
使用编译器
我们以g++为例
g++ 是 GCC 编译器套件中用于编译 C++ 代码的命令,可以直接在命令行调用并将cpp文件编译成exe可执行文件,我们运行的就是编译产生的exe文件。通常,g++ 命令的一般形式如下:
g++ [选项] 文件名.cpp -o 输出文件名
其中:
-
[选项]
是一些可选的编译选项,用于控制编译的行为,例如优化级别、警告级别等。常见的选项包括:-
-c
:只编译源文件而不进行链接,生成目标文件。 -
-g
:在目标文件中包含调试信息,以便使用调试器进行调试。 -
-Wall
:显示所有警告信息。 -
-O2
:启用优化等级 2。 -
-std=c++20
: 指定c++版本 -
等等,具体选项可以使用
g++ --help
查看。 -
文件名.cpp
是你要编译的 C++ 源代码文件名。 -
-o 输出文件名
指定编译生成的可执行文件的名称,不用写.exe
这个拓展名。
-
例如,要编译一个名为 hello.cpp
的 C++ 源代码文件并将生成的可执行文件命名为 hello
,可以执行以下命令:
g++ hello.cpp -o hello
如果要在编译过程中启用调试信息,可以添加 -g
选项:
g++ -g hello.cpp -o hello
这样编译生成的可执行文件 hello
就包含了调试信息,可以使用调试器进行调试,可以配合gdb使用(感兴趣可以了解,产生调试信息都是用gdb产生的,gdb在是包含在刚才下载的工具链中的)。
配合使用
g++
和gdb
可以进行C++程序的编译和调试。下面是一个简单的步骤:
编译程序并包含调试信息:
使用
g++
编译程序时,添加-g
选项,以便在生成的可执行文件中包含调试信息。例如:g++ -g a.cpp -o a
启动调试器:
使用
gdb
启动调试器,并指定要调试的可执行文件:gdb ./my_program
设置断点:
在
gdb
命令行中,可以设置断点以便在程序执行到某一行时暂停执行并进入调试模式。例如,设置在main
函数的第一行处的断点:(gdb) break main
运行程序:
在
gdb
命令行中,输入run
命令来运行程序:(gdb) run
执行程序和调试:
一旦程序运行起来,可以使用
step
,next
,continue
等命令来控制程序的执行,以及查看变量的值、栈信息等。例如:
step
:逐行执行程序,如果遇到函数调用,则进入函数内部执行。next
:逐行执行程序,如果遇到函数调用,则直接执行函数并返回到下一行。continue
:继续执行程序直到遇到下一个断点或程序结束。print 变量名
:打印变量的值。backtrace
:查看函数调用栈。- 等等。
退出调试器:
当调试完成后,可以使用
quit
命令退出gdb
调试器:(gdb) quit
一个大致的使用过程
❯ gdb ./a GNU gdb (GDB) 13.1 Copyright (C) 2023 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-w64-mingw32". Type "show configuration" for configuration details. For bug reporting instructions, please see: <https://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from ./a... (gdb) break main Breakpoint 1 at 0x140001464: file 1009.cpp, line 54. (gdb) run Starting program: C:\Users\Fighoh\file\code\c\test\a.exe [New Thread 18096.0x4a14] [New Thread 18096.0x13d8] [New Thread 18096.0x3d78] Thread 1 hit Breakpoint 1, main () at 1009.cpp:54 54 ios::sync_with_stdio(false); cin.tie(nullptr); (gdb) step 55 int _ = 1; (gdb) step 56 cin >> _; (gdb) step 2 57 while (_--) (gdb) print(_) $1 = 2 (gdb) run The program being debugged has been started already. Start it from the beginning? (y or n) n Program not restarted. (gdb) step 58 solve(); (gdb) step solve () at 1009.cpp:50 50 } (gdb) step main () at 1009.cpp:57 57 while (_--) (gdb) print(_) $2 = 1 (gdb) step 58 solve(); (gdb) step solve () at 1009.cpp:50 50 } (gdb) step main () at 1009.cpp:57 57 while (_--) (gdb) print(_) $3 = 0 (gdb) step 59 return 0; (gdb) step 60 } (gdb) step __tmainCRTStartup () at C:/M/B/src/mingw-w64/mingw-w64-crt/crt/crtexe.c:273 273 C:/M/B/src/mingw-w64/mingw-w64-crt/crt/crtexe.c: No such file or directory. (gdb) quit A debugging session is active. Inferior 1 [process 18096] will be killed. Quit anyway? (y or n) y
一些常见问题
- 无法定位动态链接库
- g++所在目录的路径在添加至环境变量的时候直接添加到系统变量,并放到最顶部,可能是一些用到的文件在其他的环境变量中出现了并且优先级比mingw中对应文件的优先级高
- 可能是mingw文件损坏,建议直接卸载重新安装