温馨提示×

ubuntu gcc如何静态编译

小樊
50
2026-09-10 01:12:05
栏目: 智能运维

在 Ubuntu 上用 gcc 进行静态编译,核心就是让可执行文件不依赖系统的动态库(.so),而是把需要的库直接链接进二进制文件中。

下面按常见场景说明。


一、最基础的静态编译

gcc main.c -static -o main
  • -static:告诉 gcc 优先使用静态库(.a)
  • 生成的可执行文件不依赖 libc.so

查看是否静态:

file main
ldd main

如果是静态的,ldd 会显示:

not a dynamic executable

二、常见“静态失败”的原因

1️⃣ 系统没装静态库

Ubuntu 默认 不安装静态库。

安装 glibc 静态库

sudo apt update
sudo apt install libc6-dev-static

否则会报错:

cannot find -lc

2️⃣ 使用了不支持静态链接的库

例如:

  • pthread
  • dl
  • 某些第三方 .so 库

可以显式写:

gcc main.c -static -lpthread -o main

如果库只有 .so,那无法静态链接。


三、C++ 静态编译

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

适合:

  • 避免 glibc 版本不兼容
  • 但仍使用系统动态库

五、确认静态链接结果

ldd ./main

或:

nm main | grep ' U '

如果几乎没有 U(未定义符号),说明基本静态。


六、常见问题总结

问题 解决
cannot find -lc 安装 libc6-dev-static
文件还是动态 检查是否用了 .so 库
体积很大 静态编译正常
Docker 用 静态编译很适合

七、最简可用模板(Ubuntu)

sudo apt install build-essential libc6-dev-static
gcc main.c -static -o main

如果你有:

  • 具体报错
  • 用到某个库(如 OpenSSL / pthread / boost)
  • 想在 Docker / ARM 上静态编译

可以贴出来,我可以给你精确命令。

0 踩