温馨提示×

ubuntu c++如何静态编译

小樊
40
2026-09-08 09:57:23
栏目: 编程语言

在 Ubuntu 下用 C++ 静态编译,通常是指把 标准库(libstdc++)和运行库(libgcc) 一起打进可执行文件,生成不依赖系统动态库的程序。

下面按常见场景说明。


一、最基本的静态编译(仅静态链接 C/C++ 运行库)

g++ main.cpp -o main -static

✅ 效果:

  • 静态链接 libstdc++libgcclibc
  • 生成的可执行文件不依赖外部 .so

⚠️ 注意:

  • 需要安装静态库:
sudo apt update
sudo apt install g++ build-essential
sudo apt install libc6-dev glibc-static

二、只静态链接 C++ 标准库(推荐方式)

有时你只想静态 C++ 库,但还是用动态 libc:

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

✅ 优点:

  • 不依赖 libstdc++.so
  • 仍然兼容系统 libc

三、使用 CMake 静态编译

方法 1:命令行指定

cmake -DCMAKE_EXE_LINKER_FLAGS="-static" ..
make

方法 2:CMakeLists.txt

set(CMAKE_EXE_LINKER_FLAGS "-static")

或只静态 C++:

set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")

四、检查是否真正静态

ldd main
  • 静态成功:
not a dynamic executable
  • 仍有依赖:
libstdc++.so.6 => ...

五、常见问题

1️⃣ 缺少静态库

报错类似:

cannot find -lstdc++

解决:

sudo apt install libstdc++-static

2️⃣ 用到 pthread

需要显式加:

g++ main.cpp -o main -static -pthread

3️⃣ 用到第三方库(如 OpenCV、Boost)

必须:

  • 第三方库也要有 .a 静态版本
  • 编译时指定 .a 路径

例如:

g++ main.cpp -o main -static \
  /usr/lib/x86_64-linux-gnu/libopencv_core.a \
  -lpthread

六、总结建议

需求 推荐
完全独立可执行 -static
只静态 C++ -static-libstdc++ -static-libgcc
发布程序 静态 C++ + 动态 libc
嵌入式/无环境 完全静态

如果你有 具体代码 / 使用的库(如 Boost、OpenCV、pthread),我可以给你精确命令。

0