温馨提示×

ubuntu中c++如何静态链接

小樊
54
2026-09-11 08:26:47
栏目: 编程语言

在 Ubuntu 下用 C++ 做静态链接(static linking),核心思路是:
让可执行文件不依赖系统的 .so 动态库,而是把库代码直接打包进可执行文件。

下面按常见情况说明。


一、静态链接自己的代码(同一项目)

如果你只有多个 .cpp 文件:

g++ main.cpp func.cpp -o app

这本身就是静态链接(代码直接编进 exe),不涉及库。


二、静态链接标准库(libstdc++ / libc)

1️⃣ 只静态链接 libstdc++

g++ main.cpp -static-libstdc++ -o app

✅ 结果:

  • libstdc++.so 不再依赖
  • 但 libc 可能仍是动态的

2️⃣ 完全静态链接(包括 libc)

g++ main.cpp -static -o app

✅ 特点:

  • 不依赖任何 .so
  • 可执行文件很大
  • 不依赖系统 glibc 版本

⚠️ 注意:

  • Ubuntu 默认 可能没装静态 glibc
  • 需要安装:
sudo apt install libc6-dev glibc-source

或:

sudo apt install g++-multilib

(32 位静态需要)


三、静态链接第三方库(如 pthread、boost)

示例:静态链接 pthread

g++ main.cpp -static -lpthread -o app

前提是:

  • 系统有 libpthread.a

示例:静态链接 Boost

g++ 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:后面用 .so

五、如何确认是否静态链接

ldd 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

如果你有:

  • 具体库(如 OpenCV / protobuf / fmt)
  • Docker / CI 场景
  • 交叉编译

可以告诉我,我可以给你精确命令。

0 踩