最省心的是g++,linux原生支持且多数发行版预装或一键安装;clang虽报错友好但需手动配置libc++;编译.cpp文件必须用g++而非gcc,避免链接错误。

Linux下写C++代码用什么编译器最省心
Linux原生支持g++,绝大多数发行版预装或一条命令就能装好,不用额外配环境。Clang虽然更现代、报错更友好,但默认没装,新手容易卡在安装和libc++链接上。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 先跑
g++ --version确认有没有;没有就sudo apt install g++(Ubuntu/Debian)或sudo dnf install gcc-c++(Fedora/RHEL) - 别直接用
gcc编译.cpp文件——它可能不自动链接libstdc++,报undefined reference to `std::cout'这类错 - 简单编译就用
g++ -o hello hello.cpp,加-std=c++17明确标准,避免默认用老标准(比如CentOS 7默认C++98)
头文件找不到?不是路径问题,是标准库版本不匹配
常见错误是#include <filesystem></filesystem>或#include <span></span>报错,不是你没装对包,而是libstdc++太旧——比如Ubuntu 18.04自带的GCC 7.5不带完整std::filesystem实现。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 查
g++ -dumpversion和strings /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | grep GLIBCXX,看最高支持到哪个GLIBCXX_3.4.xx -
std::filesystem需要GLIBCXX_3.4.26+,对应GCC 9+;升级GCC要小心——别用PPA乱装,可能搞崩系统包管理 - 临时绕过:改用
boost::filesystem,头文件#include <boost></boost>,编译时加-lboost_filesystem -lboost_system
跨平台代码在Linux下运行崩溃,大概率是未定义行为被ASLR暴露
Windows下“凑巧能跑”的代码,比如读未初始化的std::vector<int> v; int x = v[0];</int>,在Linux下常因地址空间布局随机化(ASLR)直接段错误。这不是Linux有问题,是它更早把bug打出来。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- 编译加
-fsanitize=address,undefined,运行时会直接报出越界、未初始化、整数溢出等位置 - 别依赖
std::string的COW(写时复制)——GCC 5+已废弃,Clang从不用,Linux下行为和Windows不同 - 多线程里用
std::shared_ptr要注意析构顺序:Linux内核对pthread_key_create资源回收更严格,野指针容易立刻触发SIGSEGV
Makefile写得再漂亮,也别在Linux下硬套Windows的路径逻辑
写src\main.cpp或#include "incconfig.h"在Linux下直接失败——路径分隔符只能是/,反斜杠会被当普通字符处理,导致文件找不到或头文件包含链断裂。
实操建议:
立即学习“C++免费学习笔记(深入)”;
- CMake比手写Makefile更适合跨平台:
add_executable(myapp src/main.cpp)天然忽略路径分隔符差异 - 如果必须用Makefile,所有路径统一用
/,且避免硬编码./build这种相对路径——用$(abspath .)或$(CURDIR)更稳 - 头文件搜索路径用
-I./include而不是-I.include,后者在Linux下等于加了个叫“.include”的目录名,根本不存在
跨平台最难的不是语法差异,是那些“只在一种系统上恰好不炸”的隐性依赖——比如std::chrono::system_clock::now()在某些Linux内核下返回负值,而Windows不会;又比如fopen("data.txt", "r")在Windows下自动处理BOM,在Linux下读出来就是乱码。这些点不踩一次,很难意识到。










