繁体   English   中英

使用带有clang ++ -stdlib = libc ++的libstdc ++编译库

[英]Using libstdc++ compiled libraries with clang++ -stdlib=libc++

我在Mac OS X(10.8.2)下使用C ++工作,最近我想出了使用C ++ 11功能的需求,这些功能可以通过使用libc ++ stdlib的clang ++编译器获得。 但是,我还需要使用一些针对libstdc ++编译和链接的遗留库(来自MacPorts)。

这样做,我得到链接错误,因为使用例如std::string的遗留库的头部需要针对std::__1::basic_string (即std::string的libc ++实现)进行解析而不是std::basic_string实现。

有没有办法在开发中混合两个库(例如,通过使用一些预处理器标志?)

您所看到的是使用内联命名空间来实现ABI版本控制。

那意味着什么:

libstdc ++ std::string是一个与libc ++ std::string不同的数据结构。 前者是参考计数设计,而后者不是。 虽然它们与API兼容,但它们不兼容ABI。 这意味着如果使用libstdc ++构造一个std::string ,然后将其传递给与libc ++链接的其他代码,接收代码会认为它有一个libc ++ std::string 即接收者不会知道它应该递增或递减参考计数。

如果没有内联命名空间,结果将是运行时错误。 你可能希望的最好的是崩溃。 使用内联命名空间,此运行时错误将转换为链接时错误。

程序员libstdc ++ std::string和libc ++ std::string看起来像是同一个类型。 但是对于链接器,它们看起来像完全不同的类型(线索是std::__1命名空间)。 链接器的视图是正确的。 它们完全不同的类型。

所以,是的,你可以操纵一些预处理器标志来获取链接的东西。 但是那时你会有一个时间调试结果运行时错误。

做你想做的事的唯一方法是使这些dylib之间的接口不涉及std:: types,如string 例如,您可以传递char数组。 您甚至可以将内存所有权从libstdc ++链接代码转移到libc ++链接代码,反之亦然(它们都将转移到同一个malloc池)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM