在 Ubuntu 下用 C++ 做静态链接(static linking),核心思路是:
让可执行文件不依赖系统的 .so 动态库,而是把库代码直接打包进可执行文件。
下面按常见情况说明。
如果你只有多个 .cpp 文件:
g++ main.cpp func.cpp -o app
这本身就是静态链接(代码直接编进 exe),不涉及库。
g++ main.cpp -static-libstdc++ -o app
✅ 结果:
libstdc++.so 不再依赖libc 可能仍是动态的g++ main.cpp -static -o app
✅ 特点:
.so⚠️ 注意:
sudo apt install libc6-dev glibc-source
或:
sudo apt install g++-multilib
(32 位静态需要)
g++ main.cpp -static -lpthread -o app
前提是:
libpthread.ag++ main.cpp \
-static \
-I/usr/include \
-L/usr/lib/x86_64-linux-gnu \
-lboost_system -lboost_thread \
-o app
确保有:
ls /usr/lib/x86_64-linux-gnu/libboost_*.a
如果没有:
sudo apt install libboost-dev
例如:静态 libstdc++,动态 libc
g++ main.cpp -static-libstdc++ -o app
或者指定库路径:
g++ main.cpp \
-Wl,-Bstatic -lfoo \
-Wl,-Bdynamic -lbar \
-o app
含义:
-Bstatic:后面用 .a-Bdynamic:后面用 .soldd app
结果:
not a dynamic executable → ✅ 完全静态.so → ❌ 仍有动态依赖查看链接了哪些库:
file app
nm app | grep something
cannot find -lxxx说明没有 .a 文件
解决:
apt search libxxx-dev
sudo apt install libxxx-dev
libgcc-static-libgcc
✅ 最稳妥的完全静态:
g++ main.cpp -static -static-libgcc -static-libstdc++ -o app
如果你有:
可以告诉我,我可以给你精确命令。