使用的libstdc ++编译库与铛++ -stdlib = ++的libc使用的libstdc +

2019-05-12 23:00发布

我用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实现。

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

Answer 1:

你看到的是采用直列命名空间来实现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的餐厅均下降)。



文章来源: Using libstdc++ compiled libraries with clang++ -stdlib=libc++