2012-05-29 52 views
4

我有一个巨大的C + + 11项目插件功能。我的项目有几个库(用gcc 4.6.3编译),一个前端(用gcc 4.6.3编译)和一些插件(用gcc 4.7编译)。插件通过dlopen加载并从libs中引用。GCC 4.7编译库与GCC 4.6.3程序兼容吗?

我的项目使用模板,typeinfo,shared_ptr,stl容器等东西。

当我编译与gcc相同版本的所有东西时,一切都运行正常。当我按照我描述的方式编译时(4.6.3中的libs和frontend和4.7中的插件),我开始面临问题。

我不确定发生了什么,我希望你能给我一些线索并帮我解决这个问题。

+4

“*当我编译所有与相同版本的GCC一切运行正常。我编译时描述(库和前端在4.6.3的方式和插件4.7)我开始面临问题*“听起来像你已经回答了你自己的问题,然后... – ildjarn

回答

4

G ++ 4.6 兼容4.7,尽管人们在这里声称,只要在运行时使用libstdC++。因此从用于构建任何对象的最新版本开始。

但是对于C++ 11来说,由于支持仍在不断发展(直到最近C++ 11也是如此),所以我们一直无法避免做出一些不兼容的更改,以便改进C + +11支持。

对于您的问题,一个更完整的答案后细节到GCC-帮助邮件列表,我会考虑它

+1

我想孤立的问题,但我还没有设法做到这一点。 –

+0

要清楚:如果将库和可执行文件静态链接到不同版本的libstdC++,它将无法正常工作? – KillianDS

+0

它可能会取决于它们之间传递的是哪些类型,以及这些类型是否在版本之间更改。对于任何C++ 03或应该工作正常,对于C++ 11它依赖。 OP是否静态链接? –

4

http://gcc.gnu.org/gcc-4.7/changes.html

版本的GCC 4.7.0和4.7.1已经改变了C++标准库,它影响了C++ 11模式下的ABI:一个数据成员被添加到std :: list中,改变了它的大小并改变了一些成员函数的定义,而std :: pair的移动构造函数是non-它改变了std :: pair参数或返回类型的调用约定。对于GCC 4.7.2版本,ABI不兼容性已得到修复,但因此使用GCC 4.7.0或4.7.1编译的C++ 11代码可能与使用不同GCC版本和C++编译的C++ 11代码不兼容98/C++ 03代码与任何版本编译。

我有性病::名单问题<>