我用C ++工作在Mac OS X(10.8.2),我最近想出了使用需要C ++ 11层的功能,这些都可以通过铛++编译器使用的libc ++ STDLIB的。 但是,我还需要使用一些旧的库编译和反对的libstdc ++链接(从MacPorts的到来)。
在此过程中,我得到了链接错误,因为旧库的头文件使用,例如, std::string
,要求要针对解决std::__1::basic_string
(即的libc ++实现std::string
)代替std::basic_string
实现。
有没有办法混在发展中的两个库(例如,通过使用一些预处理器的标志吗?)
你看到的是采用直列命名空间来实现ABI版本。
那意味着什么:
所述的libstdc ++ std::string
比的libc ++不同的数据结构std::string
。 前者是一个参考计数设计,而后者则不是。 虽然他们是API兼容,它们不兼容ABI。 这意味着,如果你构建一个std::string
用的libstdc ++,然后把它传递到被打击的libc链接的其他码++,接收代码会认为它具有的libc ++ std::string
。 即接收器不会有一个线索,这应该被递增或递减引用计数。
如果没有内嵌的命名空间,其结果将是一个运行时错误。 你可以期望的最好的撞击声。 随着内嵌的命名空间这个运行时错误被转换成一个链接时错误。
为了您的程序员的libstdc ++ std::string
和的libc ++ std::string
模样相同的类型。 但对连接器,它们看起来像完全不同的类型(线索是std::__1
命名空间)。 和链接器的观点是正确的。 他们是完全不同的类型。
所以,是的,你可以操纵一些预处理标志来把事情联系起来。 但随后你将有一个时间的调试得到的运行时错误是魔鬼。
做你想做什么的唯一方法是使这些dylibs之间的接口没有涉及std::
类型,如string
。 例如,你可以通过数组char
来代替。 你甚至可以从的libstdc ++内存转移所有权 - 链接的代码到libc ++ - 链接的代码,反之亦然(他们会通过相同的malloc的餐厅均下降)。