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

CMakeLists.txt 里写了:

target_link_libraries(${PROJECT_NAME} PRIVATE
    gcc
    stdc++
)
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 的条件判断,但大多数嵌入式项目这样写最稳妥。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓁蓁啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值