温馨提示×

linux写c++要注意什么坑

小樊
33
2026-10-11 00:27:37
栏目: 编程语言

在 Linux 下写 C++,相比 Windows 有一些特有的坑和习惯差异。下面按“新手最容易踩”到“进阶注意”梳理一下,都是实战经验。


一、编译与工具链

1. GCC / G++ 版本差异

  • 不同发行版 GCC 版本不同(CentOS 7 还是 GCC 4.8,Ubuntu 22.04 是 GCC 11+)
  • C++17 / C++20 特性可能不支持
g++ --version

✅ 建议:明确指定标准

g++ -std=c++17 main.cpp

2. 必须手动链接库

Linux 不会自动链接

#include <pthread.h>
g++ main.cpp -lpthread

常见:

  • -lpthread
  • -ldl
  • -lm

3. 头文件区分大小写

Linux 严格区分大小写

#include "Log.h"   // 实际文件是 log.h → 编译失败

二、路径与文件系统

4. 路径分隔符

  • ✅ /
  • ❌ \
"/home/user/data.txt"

5. 当前目录不是 exe 所在目录

./a.out
  • 当前路径 = 运行命令的目录
  • 不是 a.out 所在目录

✅ 获取 exe 路径:

readlink("/proc/self/exe", buf, size);

三、内存与运行时

6. 段错误(Segmentation fault)

Linux 下:

  • 数组越界 不一定立刻崩
  • 野指针很常见

✅ 调试神器:

gdb ./a.out
valgrind ./a.out

7. 栈大小限制

Linux 默认栈大小有限(通常 8MB)

int a[10000000]; // 可能炸

✅ 用堆:

vector<int> a(1e7);

四、多线程与并发

8. pthread 和 std::thread

  • std::thread 底层是 pthread
  • 必须 join 或 detach
std::thread t(f);
t.detach(); // 或 join()

9. 信号(Signal)坑

  • SIGSEGV, SIGINT
  • 信号处理函数里不能做复杂操作

❌ 错误:

void handler(int) {
    cout << "error"; // 不安全
}

五、系统相关

10. 文件描述符限制

ulimit -n

默认可能只有 1024

✅ 高并发程序要调大


11. 时间函数差异

  • sleep 单位:秒
  • usleep:微秒(已废弃)
  • nanosleep:推荐
this_thread::sleep_for(100ms);

六、动态库(so)

12. .so 找不到

./app: error while loading shared libraries

✅ 解决:

export LD_LIBRARY_PATH=.

或

ldconfig

13. ABI 兼容性

  • GCC 不同版本 不保证兼容
  • 不要混用不同编译器编的 .so

七、编码与中文

14. 默认是 UTF-8

  • 文件、终端默认 UTF-8
  • Windows 是 GBK

✅ 字符串处理尽量用 std::string + UTF-8


八、习惯建议(很重要)

✅ 推荐工具:

  • 编译:g++ / clang++
  • 构建:CMake
  • 调试:gdb
  • 内存:valgrind
  • 静态检查:clang-tidy

✅ 写 Linux C++:

  • 不要依赖 Windows API
  • 不要假设“程序一定能跑完”
  • 日志比弹窗重要

总结一句话

Linux 写 C++:编译严格、运行直接、错误隐蔽、调试靠工具

如果你愿意,可以告诉我:

  • 你是新手 / 进阶
  • 做服务端 / 嵌入式 / 工具

我可以给你更针对性的“避坑清单”。

0 踩