1

我正在开发一个包含两个模块的示例项目:A 和 B(链接到 A),使用 Xcode 4.4。

在模块 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 的析构函数是非虚拟的,问题就消失了。

4

1 回答 1

0

你有没有尝试过:

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

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

于 2012-10-26T09:33:41.900 回答