首页 > 后端开发 > C++ > 正文

为什么在 C 0x 模式下使用 libc 的 Clang 无法链接 Boost::program_options 示例?

DDD
发布: 2024-11-02 15:21:30
原创
678 人浏览过

Why does Clang with libc   in C  0x mode fail to link Boost::program_options examples?

为什么不能在 c 0x 模式下用 libc clang 链接这个 boost::program_options 示例?

背景:

尝试在 C 0x 模式下使用 Clang 和 libc 编译和链接 Boost::program_options 示例时,出现以下错误:

Undefined symbols for architecture x86_64:
  // Various undefined symbols related to Boost::program_options
登录后复制

解释:

此错误的主要原因是 libc 与 GCC 的 libstdc 不二进制兼容。具体来说:

  • 在 libstdc 中,std::string 是引用计数的。
  • 在 libc 中,std::string 使用“短字符串优化”(SSO),它具有不同的内存布局和行为。

解决方案:

要解决此问题,您必须使用 Clang 以 libc 作为标准库重建 Boost:

clang++ -stdlib=libc++ ...
登录后复制

二进制不兼容的原因:

为了防止由于二进制不兼容导致的意外混合和运行时崩溃,libc 利用 C 11 的内联命名空间功能来修改 ABI(应用程序二进制接口) std::string 同时保持相同的 API(应用程序编程接口)。这确保链接器可以区分来自 libstdc 的 std::string 和来自 libc 的 std::string 。

以上是为什么在 C 0x 模式下使用 libc 的 Clang 无法链接 Boost::program_options 示例?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!