为什么在 C 0x 模式下使用 libc clang 无法链接 Boost::Program_Options 示例
给定的代码片段演示了尝试编译时出现的问题并在 C 0x 模式下利用 libc 将 boost::program_options 与 clang 链接起来。
问题分析
编译错误源于 libc 和 libstdc (默认标准)之间的不兼容由 g 实现的库。 libc 对 std::string 采用了不同的实现细节,引入了与 libstdc 的 ABI(应用程序二进制接口)差异。
解决方案
要解决此问题,有必要使用带有 -stdlib=libc 标志的 clang 重建 Boost。这确保了 Boost 库是针对可执行文件链接的同一标准库进行编译的。它协调了 Boost 库和正在编译的程序中 std::string 的 ABI。
技术说明
libc 利用内联命名空间来改变 std 的 ABI: :string 而不修改其 API。这会在两个库之间产生明显的差异,其中 libstdc 中的 std::string 和 libc 中的 std::__1::string 被链接器视为不同的数据结构。
通过使用适当的标准重建 Boost库中, boost::program_options 的符号定义与链接器期望的符号定义相匹配,从而能够成功链接。
以上是为什么在 C 0x 模式下使用 libc 的 Clang 无法链接 Boost::Program_Options?的详细内容。更多信息请关注PHP中文网其他相关文章!