我正在使用Xcode 4.4使用两个模块进行示例项目:A和B(链接到A)。

在模块A中,符号被编译器标志-fvisibility = hidden隐藏。我有一个其析构函数是虚拟的并已导出的类:

class utx
{
    int mm;
public:
    __attribute__ ((visibility("default"))) utx(int m);
    __attribute__ ((visibility("default"))) virtual ~utx();
};


它实现为:

utx::utx(int m) : mm(m) { }
utx::~utx() { }


在模块B中,MyUtx源自utx,如下所示:

class MyUtx : public utx
{
public:
    MyUtx() : utx(5) { }
    virtual ~MyUtx() { }
}Ins;


一会儿,我总是得到模块B的链接错误:

Undefined symbols for architecture x86_x64:
    "typeinfo for utx", referenced from:
        typeinfo for MyUtx in main.o


如果utx的析构函数不是虚拟的,那么问题就消失了。

最佳答案

你有没有尝试过:

class __attribute__ ((visibility("default"))) utx
{
  ...


根据http://gcc.gnu.org/wiki/Visibility,typeinfo的生成取决于您的类是否具有vfptr,并且添加虚拟析构函数可以更改该类型(如果您没有其他虚函数)。

10-08 05:53