在 Ubuntu 下做 C++ 静态链接,核心思路是:
让编译器/链接器使用 .a 静态库,而不是 .so 动态库。
下面分几种常见情况说明。
g++ main.cpp -o main -static
✅ 效果:
.so⚠️ 注意:
sudo apt install g++ libstdc++-12-dev # 版本号可能不同
如果你只想静态链接 libstdc++,但保留系统 libc(更安全):
g++ main.cpp -o main -static-libstdc++
✅ 特点:
libfoo.ag++ main.cpp -o main libfoo.a
或:
g++ main.cpp -o main -L. -lfoo
⚠️ 前提:
libfoo.alibfoo.so(否则会优先动态链接).a 文件g++ main.cpp /usr/lib/x86_64-linux-gnu/libssl.a \
/usr/lib/x86_64-linux-gnu/libcrypto.a
-static + -lg++ main.cpp -o main -static -lssl -lcrypto
⚠️ 需要确保:
sudo apt install libssl-dev
并且系统中有 .a 文件。
ldd main
✅ 如果输出:
not a dynamic executable
说明完全静态链接。
✅ 如果有 .so 路径,说明仍有动态库。
cannot find -lstdc++ / undefined reference原因:
解决:
sudo apt install libstdc++-12-dev
❌ 不推荐完全静态链接 glibc
原因:
✅ 推荐做法:
-static-libstdc++
set(CMAKE_EXE_LINKER_FLAGS "-static-libstdc++")
或:
target_link_libraries(app PRIVATE -static-libstdc++)
| 需求 | 推荐方式 |
|---|---|
| 只静态 C++ 标准库 | -static-libstdc++ ✅ |
| 完全静态 | -static(谨慎) |
| 第三方库 | 使用 .a |
| 发布程序 | -static-libstdc++ |
如果你愿意,可以告诉我:
我可以给你一个完整可编译示例。