使用 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;
};
libfoo
和 bar
都广泛使用了 boost。 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
时,此问题不再发生。
到目前为止工作
我通过 nm 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"。
前言
处理大量代码,我目前无法将其分解为 MCVE,所以我会尽力而为。
问题
我正在处理一个编译为静态库的大型项目,libfoo.a
。一个单独的项目,bar
,links 针对该库。 libfoo
中的“违规”片段如下:
class Base {
public:
void foo(){}
void bar(){}
};
class Derived : private Base {
public:
using Base::foo;
};
libfoo
和 bar
都广泛使用了 boost。 bar
必须使用 -std=c++11
进行编译,因为它使用了 C++11 功能,但是 libfoo
可以使用最少的选项进行编译(即 GCC v4.8 使用的默认编译器选项,似乎是 -std=c++0x
-std=gnu++03
).
当我尝试 link bar
使用 GCC 默认值 编译 -std=c++0x
libfoo.a
,它失败并出现一个冗长的名称错误的警告,该警告减少为:
Undefined reference to Base::Derived::foo()
当我用 -std=c++11
重新构建 libfoo.a
时,此问题不再发生。
到目前为止工作
我通过 nm 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"。