温馨提示×

linux c++配置如何静态链接

小樊
45
2026-09-05 04:47:56
栏目: 编程语言

Linux 下用 C++ 做静态链接,通常是指把 标准库、运行时库以及第三方库 都链接成 .a 文件,最终生成一个 不依赖动态库(.so) 的可执行文件。

下面按 常见场景 给你说明。


一、最基本的方式(静态链接标准库)

1️⃣ 使用 -static

g++ main.cpp -o main -static

✅ 效果:

  • 所有能静态链接的库全部静态链接
  • 生成的可执行文件不依赖 libstdc++.solibc.so

❌ 注意:

  • 需要系统安装了 静态库
    # Debian / Ubuntu
    sudo apt install libc6-dev glibc-static g++-multilib
    

二、只静态链接 C++ 标准库(常见)

有时候你 不想完全静态链接 glibc(避免兼容性问题),只静态 C++ 库:

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

✅ 优点:

  • 不依赖 libstdc++.so
  • 仍然使用系统 libc.so(推荐方式)

三、链接自己的静态库(.a)

1️⃣ 先编译静态库

g++ -c foo.cpp -o foo.o
ar rcs libfoo.a foo.o

2️⃣ 链接静态库

g++ main.cpp -L. -lfoo -o main

⚠️ 注意顺序(Linux 下很重要):

  • 源文件在前,库在后
  • 依赖顺序从右到左

✅ 强制静态:

g++ main.cpp -L. -Wl,-Bstatic -lfoo -Wl,-Bdynamic

四、CMake 中配置静态链接

方式 1:完全静态

set(CMAKE_EXE_LINKER_FLAGS "-static")

方式 2:只静态 C++ 库(推荐)

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libgcc -static-libstdc++")

方式 3:指定静态库

target_link_libraries(app PRIVATE foo)

如果是 .a

target_link_libraries(app PRIVATE ${CMAKE_SOURCE_DIR}/lib/libfoo.a)

五、查看是否静态链接

ldd main
  • 输出 not a dynamic executable ✅ 完全静态
  • 只有 libc.so ✅ 半静态(推荐)

六、常见问题

❓ 报错:cannot find -lc

说明没装静态 glibc:

sudo apt install libc6-dev glibc-static

❓ 完全 -static 在某些系统不可用

✅ 推荐:

-static-libgcc -static-libstdc++

七、推荐方案(总结)

场景 推荐
发布工具 / 容器 -static
普通 Linux 程序 -static-libgcc -static-libstdc++
第三方库 .a + -Wl,-Bstatic

如果你愿意,可以告诉我:

  • 用的 g++ / clang
  • 是否用 CMake
  • 是否要 完全无依赖

我可以直接给你一份完整可编译示例。

0