在 Ubuntu 上用 gcc 进行静态编译,核心就是让可执行文件不依赖系统的动态库(.so),而是把需要的库直接链接进二进制文件中。
下面按常见场景说明。
gcc main.c -static -o main
-static:告诉 gcc 优先使用静态库(.a)libc.so查看是否静态:
file main
ldd main
如果是静态的,ldd 会显示:
not a dynamic executable
Ubuntu 默认 不安装静态库。
sudo apt update
sudo apt install libc6-dev-static
否则会报错:
cannot find -lc
例如:
pthreaddl.so 库可以显式写:
gcc main.c -static -lpthread -o main
如果库只有 .so,那无法静态链接。
g++ main.cpp -static -o main
需要安装:
sudo apt install g++ libstdc++-static
只静态 libc,不静态所有库:
gcc main.c -Wl,-Bstatic -lc -Wl,-Bdynamic -o main
或:
gcc main.c -static-libgcc -static-libstdc++ -o main
适合:
ldd ./main
或:
nm main | grep ' U '
如果几乎没有 U(未定义符号),说明基本静态。
| 问题 | 解决 |
|---|---|
cannot find -lc |
安装 libc6-dev-static |
| 文件还是动态 | 检查是否用了 .so 库 |
| 体积很大 | 静态编译正常 |
| Docker 用 | 静态编译很适合 |
sudo apt install build-essential libc6-dev-static
gcc main.c -static -o main
如果你有:
可以贴出来,我可以给你精确命令。