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)
双方libfoo并bar广泛使用的提升.bar必须编译,-std=c++11因为它使用了C++ 11的功能,但libfoo可以用最少的选项编译(即GCC v4.8使用的默认编译器选项,似乎是).-std=c++0x-std=gnu++03
当我尝试bar使用编译的GCC默认值进行链接时,它会因为冗长的名称错误警告而失败,该警告会减少为:-std=c++0xlibfoo.a
Undefined reference to Base::Derived::foo()
Run Code Online (Sandbox Code Playgroud)
当我重新构建libfoo.a时-std=c++11,不再出现此问题.
我比较了libfoo.avia nm的输出,在这两种情况下,都存在适当的符号.我还浏览了Cxx11Abi兼容性文档,看来这个编译器设置不应该"破坏"兼容性.
这个链接器问题的原因是什么?
正如 MartinBonner 指出的那样,这与函数原型中使用的类型的命名空间更改有关。唯一的解决方案是编译-std=c++11或重写大量代码,以便在类型周围有一个额外的“抽象”层。
| 归档时间: |
|
| 查看次数: |
301 次 |
| 最近记录: |