在 CentOS 上静态编译 C++ 程序,核心思路是:
让链接阶段使用 .a 静态库,而不是 .so 动态库。下面按「最常见场景 → 进阶场景 → 常见问题」来说明。
CentOS 默认 不安装静态库,必须先装:
sudo yum install -y glibc-static libstdc++-static
如果你用的是 CentOS 8 / Rocky / Alma,用 dnf:
sudo dnf install -y glibc-static libstdc++-static
-static 编译g++ main.cpp -o main -static
✅ 效果:
.so验证:
file main
ldd main
如果看到:
not a dynamic executable
✅ 表示静态编译成功
有时你只想静态链接 libstdc++,但保留系统动态库:
g++ main.cpp -o main -static-libstdc++
✅ 优点:
libstdc++.soglibc(兼容性更好)g++ main.cpp -o main -static
⚠️ 注意:
getaddrinfo)✅ 适合:
如果你想要 真正干净、可移植的静态二进制,推荐使用 musl。
sudo yum install -y epel-release
sudo yum install -y musl musl-devel musl-gcc
musl-g++ main.cpp -o main
✅ 特点:
cmake -DCMAKE_EXE_LINKER_FLAGS="-static" ..
make
set(CMAKE_EXE_LINKER_FLAGS "-static")
或只静态 C++ 库:
target_link_options(myapp PRIVATE -static-libstdc++)
-static 支持ld: cannot find -lc
✅ 解决:
sudo yum install glibc-static
原因:
✅ 解决:
-staticg++ --version
如果是 4.8,建议升级:
sudo yum install centos-release-scl
sudo yum install devtoolset-11
scl enable devtoolset-11 bash
| 需求 | 推荐方式 |
|---|---|
| 只想不依赖 libstdc++ | -static-libstdc++ |
| 单机 / 离线程序 | g++ -static |
| 跨系统 / Docker | musl-g++ |
| 线上服务 | ❌ 不建议完全静态 |
如果你愿意,可以告诉我:
我可以给你 精确到命令级别的方案。