在 Linux 下使用 C++ 进行静态编译,通常是指把程序依赖的 C/C++ 标准库(libc、libstdc++) 以及你用到的第三方库,全部打包进最终的可执行文件里,生成 不依赖系统动态库 的二进制文件。
下面按常见场景说明。
g++ main.cpp -o app
这是动态链接(默认),生成的可执行文件依赖:
ldd app
-static 完全静态编译g++ main.cpp -static -o app
✅ 效果:
libc、libstdc++glibc❌ 注意:
sudo apt install libc6-dev glibc-static g++-multilib
很多时候你只想静态 C++ 运行时:
g++ main.cpp -static-libgcc -static-libstdc++ -o app
好处:
libstdc++.solibc(兼容性更好)假设你有:
libfoo.a(静态库)g++ main.cpp -L. -lfoo -static-libgcc -static-libstdc++ -o app
⚠️ 注意顺序(很重要):
源文件 → 库
错误示例(可能链接失败):
g++ -lfoo main.cpp
set(CMAKE_EXE_LINKER_FLAGS "-static")
或:
target_link_options(app PRIVATE -static)
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")
ldd app
结果:
not a dynamic executable ✅ 完全静态.so ❌ 仍有动态依赖-lstdc++ 静态库sudo apt install libstdc++-static
g++ main.cpp -static -pthread
.a 版本.so)无法静态链接| 需求 | 推荐方式 |
|---|---|
| 完全独立程序 | -static |
| 兼容性好 | -static-libgcc -static-libstdc++ |
| 带第三方库 | 提供 .a + 正确顺序 |
如果你有 具体库(Boost / OpenCV / protobuf / 交叉编译) 或 发行版(Ubuntu/CentOS),我可以给你更精确的命令。