在命令行中编译cpp文件
查看g++版本信息
bash
g++ --version
最常用命令, 用于确认编译器是否安装以及其型号
我的电脑g++输出
txt
C:\Users\bushuo>g++ --version
g++ (x86_64-win32-seh-rev1, Built by MinGW-Builds project) 14.2.0
Copyright (C) 2024 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
核心版本标识
上段信息输出内容非常详细, 不仅输出版本号, 还透露了编译器架构、线程模式、异常处理机制以及构建来源.
-
x86_64(架构), 表示为64位的编译器, 生成的.exe程序只能在64位的Windows系统上运行, 无法生成32位程序; -
win32(线程模式), 表示该编译器使用Win32API来实现C++的多线程功能, 另一种常见的模式是posix;- win32模型在Windows上原生支持最好, 不需要额外的兼容层, 对于绝大多数日常开发, win32是MinGW在Windwos上的默认且推荐选择.
-
seh (异常处理机制), 代表 Structured Exception Handling (SEH), 是 Windows 原生的异常处理机制
-
rev1 (修订版本)
- 这是 MinGW-Builds 项目对该特定 GCC 版本打包的第 1 次修订
- GCC 官方发布源码后,MinGW 社区会将其移植到 Windows 并打包
- 如果打包过程中发现了小问题并修复,版本号会变成 rev2, rev3
-
Built by MinGW-Builds project (构建来源)
- 表明编译器不是直接从
GNU官网下载的源码编译的, 也不是通过 choco 或 winget 安装的官方二进制包, 而是由 MinGW-Builds (一个知名的第三方社区项目, 通常在 SourceForge 上发布) 编译和分发的
- 14.2.0 (GCC 版本号)
- 是 GCC (GNU Compiler Collection) 的核心版本
- GCC 14.2.0 是 2024 年下半年发布的版本
版权与声明部分
txt
Copyright (C) 2024 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
【中文】
这是标准的 GNU 自由软件版权声明
版权所有 (C) 2024 自由软件基金会
本软件为自由软件;有关复制条件, 请查阅源代码;
本软件不提供任何担保, 甚至不包含适销性或特定用途适用性的默示担保.
- 这是标准的 GNU GPL 开源协议声明
- NO warranty:意思是软件按'原样'提供, 如果编译器把你的代码编译错了导致损失, 作者不承担法律责任(这是开源软件的通用免责条款)
命令行中的两个--与一个-
在命令行(CLI)中, --(两个连字符)和 -(一个连字符)有着严格的区别, 这是由 GNU 命令行参数约定(GNU Command Line Conventions)定义的
- (单横线)
- 短选项 (Short Option)
- 后接单个字母, 通常用于常用功能, 可以合并书写;
示例
-v(verbose);-o(output);-Wall
-- (双横线)
- 长选项 (Long Option)
- 后接完整的单词或短语, 通常用于更清晰、更具体的功能, 不可合并;
示例
--version;--help;--std=c++17
查看编译器的详细配置信息
bash
g++ -v
txt
C:\Users\bushuo>g++ -v
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=D:/MinGW/mingw64/bin/../libexec/gcc/x86_64-w64-mingw32/14.2.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../../../src/gcc-14.2.0/configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --prefix=/mingw64 --with-sysroot=/c/buildroot/x86_64-1420-win32-seh-ucrt-rt_v12-rev1/mingw64 --enable-host-shared --disable-multilib --enable-languages=c,c++,fortran,lto --enable-libstdcxx-time=yes --enable-threads=win32 --enable-libstdcxx-threads=yes --enable-libgomp --enable-libatomic --enable-lto --enable-graphite --enable-checking=release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --enable-libstdcxx-filesystem-ts=yes --disable-libssp --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-bootstrap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld --with-arch=nocona --with-tune=core2 --with-libiconv --with-system-zlib --with-gmp=/c/buildroot/prerequisites/x86_64-w64-mingw32-static --with-mpfr=/c/buildroot/prerequisites/x86_64-w64-mingw32-static --with-mpc=/c/buildroot/prerequisites/x86_64-w64-mingw32-static --with-isl=/c/buildroot/prerequisites/x86_64-w64-mingw32-static --with-pkgversion='x86_64-win32-seh-rev1, Built by MinGW-Builds project' --with-bugurl=https://github.com/niXman/mingw-builds LD_FOR_TARGET=/c/buildroot/x86_64-1420-win32-seh-ucrt-rt_v12-rev1/mingw64/bin/ld.exe --with-boot-ldflags='-pipe -fno-ident -L/c/buildroot/x86_64-1420-win32-seh-ucrt-rt_v12-rev1/mingw64/opt/lib -L/c/buildroot/prerequisites/x86_64-zlib-static/lib -L/c/buildroot/prerequisites/x86_64-w64-mingw32-static/lib -Wl,--disable-dynamicbase -static-libstdc++ -static-libgcc'
Thread model: win32
Supported LTO compression algorithms: zlib
gcc version 14.2.0 (x86_64-win32-seh-rev1, Built by MinGW-Builds project)
输出包含的关键信息
- Target: 目标架构(如 x86_64-linux-gnu)
- Configured with: 编译该编译器时使用的配置参数
- Thread model: 线程模型(如 posix)
- Supported LTO compression algorithms: 支持的压缩算法.
查看编译器过程中的详细调用
bash
g++ -v -c c++ -E /dev/null
txt
C:\Users\bushuo>g++ -v -c c++ -E /dev/null
Using built-in specs.
COLLECT_GCC=g++
Target: x86_64-w64-mingw32
Configured with: ../../../src/gcc-14.2.0/configure --host=x86_64-w64-mingw32 --build=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --prefix=/mingw64 --with-sysroot=/c/buildroot/x86_64-1420-win32-seh-ucrt-rt_v12-rev1/mingw64 --enable-host-shared --disable-multilib --enable-languages=c,c++,fortran,lto --enable-libstdcxx-time=yes --enable-threads=win32 --enable-libstdcxx-threads=yes --enable-libgomp --enable-libatomic --enable-lto --enable-graphite --enable-checking=release --enable-fully-dynamic-string --enable-version-specific-runtime-libs --enable-libstdcxx-filesystem-ts=yes --disable-libssp --disable-libstdcxx-pch --disable-libstdcxx-debug --enable-bootstrap --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --with-gnu-as --with-gnu-ld --with-arch=nocona --with-tune=core2 --with-libiconv --with-system-zlib --with-gmp=/c/buildroot/prerequisites/x86_64-w64-mingw32-static --with-mpfr=/c/buildroot/prerequisites/x86_64-w64-mingw32-static --with-mpc=/c/buildroot/prerequisites/x86_64-w64-mingw32-static --with-isl=/c/buildroot/prerequisites/x86_64-w64-mingw32-static --with-pkgversion='x86_64-win32-seh-rev1, Built by MinGW-Builds project' --with-bugurl=https://github.com/niXman/mingw-builds LD_FOR_TARGET=/c/buildroot/x86_64-1420-win32-seh-ucrt-rt_v12-rev1/mingw64/bin/ld.exe --with-boot-ldflags='-pipe -fno-ident -L/c/buildroot/x86_64-1420-win32-seh-ucrt-rt_v12-rev1/mingw64/opt/lib -L/c/buildroot/prerequisites/x86_64-zlib-static/lib -L/c/buildroot/prerequisites/x86_64-w64-mingw32-static/lib -Wl,--disable-dynamicbase -static-libstdc++ -static-libgcc'
Thread model: win32
Supported LTO compression algorithms: zlib
gcc version 14.2.0 (x86_64-win32-seh-rev1, Built by MinGW-Builds project)
COMPILER_PATH=D:/MinGW/mingw64/bin/../libexec/gcc/x86_64-w64-mingw32/14.2.0/;D:/MinGW/mingw64/bin/../libexec/gcc/;D:/MinGW/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/14.2.0/../../../../x86_64-w64-mingw32/bin/
LIBRARY_PATH=D:/MinGW/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/14.2.0/;D:/MinGW/mingw64/bin/../lib/gcc/;D:/MinGW/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/14.2.0/../../../../x86_64-w64-mingw32/lib/../lib/;D:/MinGW/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/14.2.0/../../../../lib/;D:/MinGW/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/14.2.0/../../../../x86_64-w64-mingw32/lib/;D:/MinGW/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/14.2.0/../../../
COLLECT_GCC_OPTIONS='-v' '-c' '-E' '-shared-libgcc' '-mtune=core2' '-march=nocona'
g++: warning: c++: linker input file unused because linking not done
g++: error: c++: linker input file not found: No such file or directory
g++: warning: /dev/null: linker input file unused because linking not done
g++: error: /dev/null: linker input file not found: No such file or directory
- -v: 显示详细过程;
- -x c++: 强制指定语言为 C++;
- -E: 只进行预处理, 不编译;
- /dev/null: 空输入文件.
在命令行编译 C++ 文件的命令
基础编译(最常用)
将 main.cpp 编译为可执行文件main.exe(Windows).
bash
g++ main.cpp -o main
- main.cpp: 源代码文件;
- -o main: 指定输出文件名为 main, 如果不加 -o, Linux/Mac 默认生成
a.out, Windows 默认生成a.exe.
进阶编译(推荐用于实际开发)
bash
g++ -std=c++17 -Wall -Wextra -O2 main.cpp -o main
-std=c++11 / c++14 / c++17 / c++20, 指定 C++ 语言标准版本, 避免不同编译器默认标准不同导致报错;-Wall, 开启大部分常用警告 (Warning All), 帮助发现潜在逻辑错误;-Wextra, 开启额外的警告;-O2, 开启二级优化 (Optimize), 发布版本使用, 调试时可改为 -O0 或 -g;-g, 生成调试信息 (Debug), 如果需要用 gdb 调试, 必须加此参数(通常会关闭优化 -O0);-I/path/to/include, 添加额外的头文件搜索路径, 当你的头文件不在标准路径时使用;-L/path/to/lib, 添加额外的库文件搜索路径, 链接外部库时使用;-lLibraryName, 链接指定的库,
多文件编译
A: 一次性编译所有文件(适合小项目)
bash
g++ -std=c++17 -Wall main.cpp utils.cpp student.cpp -o my_program
B: 分步编译(适合大项目, 先编译成 .o 对象文件, 再链接)
bash
# 1. 编译成对象文件 (.o)
g++ -c -std=c++17 main.cpp -o main.o
g++ -c -std=c++17 utils.cpp -o utils.o
# 2. 链接对象文件生成可执行文件
g++ main.o utils.o -o my_program