在 Linux 下用 C++ 做静态链接,通常是指把 标准库、运行时库以及第三方库 都链接成 .a 文件,最终生成一个 不依赖动态库(.so) 的可执行文件。
下面按 常见场景 给你说明。
-staticg++ main.cpp -o main -static
✅ 效果:
libstdc++.so、libc.so 等❌ 注意:
# Debian / Ubuntu
sudo apt install libc6-dev glibc-static g++-multilib
有时候你 不想完全静态链接 glibc(避免兼容性问题),只静态 C++ 库:
g++ main.cpp -o main -static-libgcc -static-libstdc++
✅ 优点:
libstdc++.solibc.so(推荐方式)g++ -c foo.cpp -o foo.o
ar rcs libfoo.a foo.o
g++ main.cpp -L. -lfoo -o main
⚠️ 注意顺序(Linux 下很重要):
✅ 强制静态:
g++ main.cpp -L. -Wl,-Bstatic -lfoo -Wl,-Bdynamic
set(CMAKE_EXE_LINKER_FLAGS "-static")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++")
target_link_libraries(app PRIVATE foo)
如果是 .a:
target_link_libraries(app PRIVATE ${CMAKE_SOURCE_DIR}/lib/libfoo.a)
ldd main
not a dynamic executable ✅ 完全静态libc.so ✅ 半静态(推荐)cannot find -lc说明没装静态 glibc:
sudo apt install libc6-dev glibc-static
-static 在某些系统不可用✅ 推荐:
-static-libgcc -static-libstdc++
| 场景 | 推荐 |
|---|---|
| 发布工具 / 容器 | -static |
| 普通 Linux 程序 | -static-libgcc -static-libstdc++ |
| 第三方库 | .a + -Wl,-Bstatic |
如果你愿意,可以告诉我:
我可以直接给你一份完整可编译示例。