使用 C++11 与 GCC 4.8 默认会导致 link 私有继承和提升错误

Using C++11 versus GCC 4.8 default causes link error with private inheritance and boost

前言

处理大量代码,我目前无法将其分解为 MCVE,所以我会尽力而为。


问题

我正在处理一个编译为静态库的大型项目,libfoo.a。一个单独的项目,bar,links 针对该库。 libfoo 中的“违规”片段如下:

class Base {
public:
    void foo(){}
    void bar(){}
};

class Derived : private Base {
public:
    using Base::foo;
};

libfoobar 都广泛使用了 bar 必须使用 -std=c++11 进行编译,因为它使用了 C++11 功能,但是 libfoo 可以使用最少的选项进行编译(即 -std=c++0x GCC v4.8 使用的默认编译器选项,似乎是 -std=gnu++03).

当我尝试 link bar 使用 -std=c++0x GCC 默认值 编译 libfoo.a,它失败并出现一个冗长的名称错误的警告,该警告减少为:

Undefined reference to Base::Derived::foo()

当我用 -std=c++11 重新构建 libfoo.a 时,此问题不再发生。


到目前为止工作

我通过 and in both cases, the appropriate symbols were present. I've also gone through the Cxx11Abi compatibility documents 比较了 libfoo.a 的输出,看起来这个编译器设置不会“破坏”兼容性。


问题

这个link这个问题的原因是什么?

正如 MartinBonner 指出的那样,它与函数原型中使用的类型的名称空间更改有关。唯一的解决方案是通过 -std=c++11 编译或重写大量代码以在类型周围多一层 "abstraction"。