在 Linux 下做 C++ 开发,和 Windows 相比“坑”更偏环境、工具链、兼容性和系统级细节。下面按常见阶段给你系统梳理,并给出避坑建议,基本覆盖 90% 的实际问题。
问题
典型现象
GLIBCXX_3.4.xx not found避坑
gcc --version
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
✅ 建议:
问题
libstdc++libc++避坑
# Clang 使用 libstdc++
clang++ -stdlib=libstdc++
# 或统一用 GCC
auto x = 10; // C++11
问题
✅ 正确做法:
g++ -std=c++17 main.cpp
-O 优化导致“奇怪行为”问题
✅ 建议:
-O0 -g
-O2 -fsanitize=undefined
问题
./a.out: error while loading shared libraries
原因
✅ 解决方式:
export LD_LIBRARY_PATH=/your/lib:$LD_LIBRARY_PATH
或:
-Wl,-rpath,/your/lib
⚠️ 不建议长期使用 LD_LIBRARY_PATH
问题
.so✅ 排查:
ldd your_program
nm -D libxxx.so
g++ main.o -lA -lB
问题
✅ 原则:
被依赖的库放后面
| 项目 | Ubuntu | CentOS |
|---|---|---|
| 包管理 | apt | yum/dnf |
| 库路径 | /usr/lib | /usr/lib64 |
| 默认 GCC | 新 | 旧 |
✅ 建议:
问题
✅ 解决:
std::thread + 静态链接问题
✅ 原因:
Linux 下性能问题更明显
✅ 工具:
perf stat ./a.out
(gdb) list
No symbol table info
✅ 原因:
-gulimit -c
✅ 解决:
ulimit -c unlimited
#include "Test.h" // Linux 区分大小写
✅:
dos2unix file.cpp
✅ 编译参数模板
g++ -std=c++17 -Wall -Wextra -Werror \
-O2 -g -fsanitize=address,undefined
✅ 环境建议
-std=你可以直接贴:
系统版本 + 编译器 + 报错信息