当前位置: 首页 > 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.dtcms.com/a/285749.html

相关文章:

  • 谈进程间通信
  • 从Hyperliquid到AILiquid:一场从极致性能到策略智能的迭代
  • 硅和锗二极管的主要区别
  • 参会邀请!2025世界人工智能大会合合信息技术交流日报名启动!
  • 深入理解 Linux 进程间通信
  • Linux——库的制作与原理
  • Linux 信号与中断 详解
  • ali linux 上安装swagger-codegen
  • Windows发现可疑的svchost程序
  • 深度理解 KVM:Linux 内核系统学习的重要角度
  • 【Linux】环境基础与开发工具的使用
  • Linux中的LVS集群技术
  • MySQL的基本操作及相关python代码
  • 基于极空间NAS+GL-MT6000路由器+Tailscale的零配置安全穿透方案
  • 云原生 DevOps 实战之Jenkins+Gitee+Harbor+Kubernetes 构建自动化部署体系
  • 小白学Python,网络爬虫篇(2)——selenium库
  • 图机器学习(13)——图相似性检测
  • 信息学奥赛一本通 1575:【例 1】二叉苹果树 | 洛谷 P2015 二叉苹果树
  • 短视频矩阵系统哪家好?全面解析与推荐
  • 香港服务器SSH安全加固方案与密钥认证实践
  • Flutter权限管理终极指南:实现优雅的Android 48小时授权策略
  • GLU 变种:ReGLU 、 GEGLU 、 SwiGLU
  • android 信息验证动画效果
  • 精通 triton 使用 MLIR 的源码逻辑 - 第002节:再掌握一些 triton 语法 — 通过 02 softmax
  • 续签人员李权
  • 掌上医院微信小程序平台如何对接医保在线支付?
  • vue自定义指令bug
  • poi-excel-添加水印
  • Vue3 学习教程,从入门到精通,Vue3 项目打包语法知识点及案例代码(9)
  • Windows Server 版本之间有什么区别?