当前位置: 首页 > news >正文

-lstdc++与-static-libstdc++的用法和差异

CMakeLists.txt 里写了:

target_link_libraries(${PROJECT_NAME} PRIVATEgccstdc++
)
target_link_options(${PROJECT_NAME} PRIVATE -static-libstdc++)

看起来像是“链接了两次 C++ 标准库”,其实它们的作用完全不同:


1. target_link_libraries(... stdc++)

  • 作用:显式把 libstdc++.alibstdc++.so 链接进目标文件。
  • 这会让链接器去找 -lstdc++,即 C++ 标准库。
  • 如果用 C++ 源码,通常编译器会自动加上,但有些交叉编译/特殊场景需要你手动加。

2. target_link_options(... -static-libstdc++)

  • 作用:告诉编译器/链接器“用静态方式链接 C++ 标准库”,即强制用 libstdc++.a 而不是 libstdc++.so
  • 这是 GCC 的一个特殊选项,等价于命令行 -static-libstdc++
  • 它不是链接库,而是改变链接方式。

为什么要两个都写?

  • 只写 stdc++:链接器会找 C++ 标准库,但可能用动态库(.so)也可能用静态库(.a),取决于默认设置。
  • 只写 -static-libstdc++:如果你的工程里没有任何 C++ 源文件,链接器可能不会自动加 C++ 标准库,导致链接失败。
  • 都写:最保险,既确保链接 C++ 标准库,又确保用静态方式。

总结

  • target_link_libraries(... stdc++)确保链接 C++ 标准库
  • target_link_options(... -static-libstdc++)确保用静态方式链接 C++ 标准库

这两句不是重复,而是配合使用,保证你的嵌入式/交叉编译工程在所有场景下都能正确、静态地链接 C++ 标准库。


如需进一步精简或自动判断是否需要 stdc++,可以用 CMake 的条件判断,但大多数嵌入式项目这样写最稳妥。

http://www.lryc.cn/news/592844.html

相关文章:

  • [2025CVPR-目标检测方向] CorrBEV:多视图3D物体检测
  • 基于极空间NAS+GL-MT6000路由器+Tailscale的零配置安全穿透方案
  • 40.限流规则
  • 数据排序
  • 二进制专项
  • 探索 Vue 3.6 的新玩法:Vapor 模式开启性能新篇章
  • 网安-DNSlog
  • DOM 文档对象模型
  • GI6E 加密GRID電碼通信SHELLCODE載入
  • 柴油机活塞cad【4张】三维图+设计说明书
  • RPG58.可拾取物品二:处理玩家拾取事件
  • vue2 面试题及详细答案150道(81 - 90)
  • android14截屏
  • C++进阶-红黑树(难度较高)
  • mysql复制延迟如何处理
  • 亚马逊新手如何快速上手广告运营,实现品牌曝光与销量提升?
  • Springboot3整合Elasticsearch8(elasticsearch-java)
  • Overleaf撰写文档
  • kubernetes pod 深度解析
  • Entity Framework (EF) 深度解析
  • 荷兰KIPP ZONEN CMP4 太阳辐射传感器耐热仪器设计高温日射计一种辐射计
  • CH347 USB高速编程器烧录器
  • 菱形继承 虚继承
  • Java学习------ConcurrentHashMap
  • 外部DLL创建及使用
  • react控制react Popover组件显示隐藏
  • Agent AI(3):Agent分类
  • Jenkins pipeline 部署docker通用模板
  • 网关-微服务网关入门
  • 《Qt数据库》知识点实践