在 Ubuntu 下用 C++ 静态编译,核心是 链接静态库(.a)而不是动态库(.so)。下面按常见场景说明。
g++ main.cpp -static -o main
说明:
-static:强制使用静态链接⚠️ 如果你的系统缺少 静态库,会报错(见下面解决办法)。
Ubuntu 默认很多库只有动态版本,需要手动安装。
sudo apt update
sudo apt install build-essential
sudo apt install libc6-dev
sudo apt install libstdc++-12-dev # 根据你的 gcc 版本
sudo apt install libc6-dev-static
否则会报错:
cannot find -lc
通常 只静态链接 C/C++ 标准库,其他仍用动态库:
g++ main.cpp -static-libgcc -static-libstdc++ -o main
✅ 优点:
libgcc_s.solibstdc++.sofile main
静态编译结果类似:
main: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, ...
动态编译:
dynamically linked
g++ main.cpp \
-I/usr/include/opencv4 \
/usr/lib/x86_64-linux-gnu/libopencv_*.a \
-lpthread -ldl -static -o main
或者:
pkg-config --cflags --libs opencv4
⚠️ 第三方库 必须提供 .a 文件
-lxxx原因:缺少对应的静态库
解决:
apt search libxxx-dev
或者手动编译库时加:
./configure --enable-static
这是正常的,因为:
Linux 官方 不推荐完整静态链接 glibc,原因:
✅ 推荐:
-static-libgcc -static-libstdc++
✅ 最稳妥方案
g++ main.cpp -static-libgcc -static-libstdc++ -o main
✅ 完全静态(仅限简单程序)
g++ main.cpp -static -o main
如果你愿意,可以告诉我:
我可以给你 精确的编译命令。