c++oding="utf-8" ?>
g++ -static 会强制静态链接 libc、libstdc++、libm、libgcc、libpthread 等所有依赖库,生成不依赖任何 .so 文件的纯静态可执行文件;需确保系统已安装 libc.a 等静态库,否则报 “cannot find -lc” 等错误。

g++ -static 会链接哪些库
加 -static 后,g++ 会强制所有依赖都走静态链接,包括 libc、libstdc++、libm、libgcc 等。不是只“静态链接你写的代码”,而是整个可执行文件不依赖任何动态库(.so 文件)。
这意味着:
– 程序体积显著变大(尤其 libc 静态版常超 2MB)
– 无法享受系统 glibc 升级带来的安全修复和性能优化
– 某些功能可能不可用(如 getaddrinfo 在部分老 glibc 静态版中行为异常)
为什么编译时报 “cannot find -lc” 或 “undefined reference to `__libc_start_main`”
这类错误基本都是因为缺少静态版 C 库:libc.a。Ubuntu/Debian 默认不装,需手动安装:sudo apt install libc6-dev(提供 /usr/lib/x86_64-linux-gnu/libc.a)
CentOS/RHEL 则是:sudo yum install glibc-static 或 dnf install glibc-static
其他常见缺失项:
– libstdc++.a:通常随 g++ 包自带,但若用自建 toolchain 可能缺
– libgcc.a:一般在 libgcc- 或 gcc-x86-64-linux-gnu 包里
– 若用 -pthread,还需 libpthread.a(同属 glibc-static)
如何确认最终生成的是纯静态可执行文件
别只看有没有报错,要验证结果是否真静态:
- 运行
file your_program,输出含statically linked才算成功 - 运行
ldd your_program,应显示not a dynamic executable;若显示一堆=> /xxx.so,说明-static失效了 - 注意:某些系统(如 Alpine)默认用 musl,
-static行为不同;而 macOS 的 clang 不支持-static(链接器不认)
替代方案:只静态链接部分库(比如 libstdc++)
全静态太重,常见折中是仅静态链接标准 C++ 库,其余仍动态:
g++ main.cpp -Wl,-Bstatic -lstdc++ -Wl,-Bdynamic -o app
说明:
– -Wl,-Bstatic 告诉链接器接下来的库优先静态
– -lstdc++ 就按静态找(需有 libstdc++.a)
– -Wl,-Bdynamic 切回动态模式,后续库(如 libc)照常动态链接
– 这种写法对顺序敏感:-Wl,-Bstatic 必须紧挨着要静态的 -l 项,否则无效
容易被忽略的一点:C++ 程序即使没显式用 std::,也可能隐式依赖 libstdc++(比如异常处理、RTTI),所以只靠 -static-libstdc++ 不够保险,-Wl,-Bstatic -lstdc++ 更可控。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











