1

Xcode 4.4を使用して、AとB(Aにリンク)の2つのモジュールを含むサンプルプロジェクトに取り組んでいます。

モジュール 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 に答える