使用C++;11与GCC4.8默认值相比,私有继承和boost会导致链接错误 序言

使用C++;11与GCC4.8默认值相比,私有继承和boost会导致链接错误 序言,boost,nm,c++,linux,c++11,gcc,abi,Boost,Nm,C++,Linux,C++11,Gcc,Abi,处理一大块我目前无法分解成的代码,所以我会尽全力 问题 我正在处理一个编译为静态库的大型项目,libfoo.a。一个单独的项目,bar,链接到该库。libfoo中的“违规”代码段如下: class Base { public: void foo(){} void bar(){} }; class Derived : private Base { public: using Base::foo; }; libfoo和bar都广泛使用了条必须使用-std=c++11进行

处理一大块我目前无法分解成的代码,所以我会尽全力


问题 我正在处理一个编译为静态库的大型项目,
libfoo.a
。一个单独的项目,
bar
,链接到该库。
libfoo
中的“违规”代码段如下:

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

class Derived : private Base {
public:
    using Base::foo;
};
libfoo
bar
都广泛使用了<由于使用了c++11的功能,代码>条必须使用
-std=c++11
进行编译,但是
libfoo
可以使用最少的选项进行编译(即
-std=c++0x
GCC v4.8使用的默认编译器选项,看起来是
-std=gnu++03

当我尝试使用
-std=c++0x
编译的
libfoo.a
链接
bar
时,它会失败,并出现一个冗长的名称损坏警告,该警告减少为:

Undefined reference to Base::Derived::foo()
当我用
-std=c++11
重新构建
libfoo.a
时,这个问题不再发生


工作至今 我比较了
libfoo.a
via的输出,在这两种情况下,都出现了合适的符号。我也经历过,这个编译器设置似乎不应该“破坏”兼容性


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

正如MartinBonner所指出的,它与函数原型中使用的类型的名称空间更改有关。唯一的解决方案是通过
-std=c++11
编译,或者重新编写大量代码,在类型周围增加一层“抽象”。

你说的“最小设置”是什么意思?难道不应该与
-std=c++11
相同吗?@tobi303我的意思是没有额外的编译器选项(即编译器的默认设置:在本例中为GCC v4.8.4)。你说“libfoo可以用最少的选项编译”(我的重点)。显而易见的解决办法是尝试用
-std=c++11
编译它。我唯一能想到的是,c++11世界中的
foo
类型与gnu++03世界中的不同。(可能
foo
的参数已从命名空间
std::experiative
移动到
std
?)您是否使用预处理器条件或其他机制在C++03和C++11模式下提供不同的类定义?如何为C++11库导出与C++03兼容的接口?能否给出名称空间更改的示例?这样做将使这成为一个更好的答案。