如何在Linux系统下用命令行编译C++源文件?(入门必看)

1次阅读

g++ 编译单个。cpp 文件最简流程是直接运行 g ++ 命令,默认生成 a.out;需用 g ++ 而非 gcc 以自动链接 C ++ 标准库;开发阶段应始终启用 -Wall -Wextra - g 选项并注意头文件包含路径。

如何在 Linux 系统下用命令行编译 C ++ 源文件?(入门必看)

g++ 编译单个 .cpp 文件最简流程

直接用 g++ 就能完成,不需要额外配置或项目文件。默认生成可执行文件 a.out,不加 -o 参数时别指望看到和源文件同名的输出。

  • g++ hello.cpp → 生成 a.out,运行用 ./a.out
  • g++ -o hello hello.cpp → 指定输出为 hello,运行更直观
  • 如果报 command not found: g++,说明没装编译器,Ubuntu/Debian 系统先跑 sudo apt install build-essential,CentOS/RHEL 用 sudo yum groupinstall "Development Tools"

遇到 undefined reference to `std::cout' 怎么办

这是链接阶段失败,不是语法错,常见于误用了 gcc 而非 g++。C++ 标准库(如 std::coutstd::string)的符号由 libstdc++ 提供,gcc 默认不链接它,g++ 才会自动加。

  • ✅ 正确:用 g++ main.cpp
  • ❌ 错误:用 gcc main.cpp(即使文件里只有 C++ 代码)
  • ⚠️ 补救:若坚持用 gcc,得手动加 -lstdc++,即 gcc main.cpp -lstdc++,但没必要绕路

加调试信息和警告,别等崩溃了才想起

刚写完的代码大概率有隐患,开警告和调试符不是“进阶操作”,是防止低级错误的第一道筛子。

  • g++ -Wall -Wextra -g -o prog prog.cpp:开启常用警告 + 调试信息,gdbvalgrind 都依赖 -g
  • -Wall 不等于“所有警告”,比如未初始化变量可能漏掉,加上 -Wuninitialized 或直接用 -Wextra 更稳妥
  • 生产环境去掉 -g 可减小体积,但开发阶段永远带上——没有调试信息的 core dump 基本没法查

头文件找不到?路径和顺序很关键

#include "xxx.h"#include <yyy.h></yyy.h> 查找逻辑不同,系统头文件路径也未必默认包含你的目录。

立即学习 C++ 免费学习笔记(深入)”;

  • "xxx.h" 先在当前目录找,再按 -I 指定路径顺序搜索;<yyy.h></yyy.h> 直接跳过当前目录,只走 -I 和系统路径
  • 自定义头文件放当前目录就用 "myheader.h";想统一管理到 include/ 下,编译时加 -I./include
  • 别把 -I 路径写成 -I include/(开头空格),shell 会当成两个参数,g++fatal error: no input files

实际写多了就会发现,编译失败十次里有七次是路径、命名或混用 gcc/g++ 导致的,而不是语法本身。把 -Wall -g 当成肌肉记忆,比记住所有选项重要得多。

text=ZqhQzanResources