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

Clo*_*oud 5 c++ linux gcc abi c++11

前言

使用我目前无法分解为MCVE的大量代码,所以我会尽我所能.


问题

我正在使用一个编译为静态库的大型项目libfoo.a.一个单独的项目,bar链接到该库."冒犯"片段libfoo如下:

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

class Derived : private Base {
public:
    using Base::foo;
};
Run Code Online (Sandbox Code Playgroud)

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

当我尝试bar使用编译的GCC默认值进行链接时,它会因为冗长的名称错误警告而失败,该警告会减少为:-std=c++0x libfoo.a

Undefined reference to Base::Derived::foo()
Run Code Online (Sandbox Code Playgroud)

当我重新构建libfoo.a-std=c++11,不再出现此问题.


工作到目前为止

我比较了libfoo.avia 的输出,在这两种情况下,都存在适当的符号.我还浏览了Cxx11Abi兼容性文档,看来这个编译器设置不应该"破坏"兼容性.


这个链接器问题的原因是什么?

Clo*_*oud 0

正如 MartinBonner 指出的那样,这与函数原型中使用的类型的命名空间更改有关。唯一的解决方案是编译-std=c++11或重写大量代码,以便在类型周围有一个额外的“抽象”层。