2

TForm サブクラス、たとえばTForm_Subを含む*.bpl プロジェクトBPL_Aを作成します。

ヘッダー ファイルForm_Sub.hは次のように なります。

class PACKAGE TForm_Sub : public TForm
{
   ...
};

extern PACKAGE TForm_Sub* Form_Sub;

ソース ファイルForm_Sub.cppは次のようになります。

TForm_Sub* Form_Sub;

__fastcall TForm_Sub::TForm_Sub( TComponent* Owner )
{
   ...
}

そして、別の *.bpl プロジェクトBPL_Bを作成して、TForm_Sub インスタンスを動的に作成します。

class PACKAGE SomeClass
{
   public:
      TForm* CreateUI( const AnsiString& name );
};

#include "Form_Sub.h"

TForm* SomeClass::CreateUI( const AnsiString& name )
{
   if( name == xxx )
   {
      if( Form_Sub != NULL )
      {
         Form_Sub = new TForm_Sub( owner );
      }
      return Form_Sub;
   }
}

BPL_B の Requires セクションに BPL_A.bpi を追加します。ただし、BPL_B をビルドすると、次のリンク エラーが発生します。

[ILINK32 エラー] エラー: モジュール xxx.OBJ 内の SomeClass::CreateUI() をエクスポートすると、ユニット BPL_A]Form_Sub 内の __fastcall TForm_Sub::TForm_Sub() が参照されます。

何が欠けているのかわかりません。

4

1 に答える 1

3

#pragma package(smart_init)ソース (xxx.cpp) ファイルにディレクティブを追加してみてください。

C++builderのヘルプによると:

モジュール 'module' のエクスポート 'symbol' は、ユニット 'unit' の 'symbol' を参照しています

ユニットではない (#pragma package(smart_init)ディレクティブを含まない) モジュールからシンボルをエクスポートしようとしており、ユニット内のシンボルを参照しています。そのようなシンボルがある場合、誰かがそのインポートにリンクできるため、これは許可されていません。インポートが呼び出されると、ユニット コードが呼び出されます。エクスポートされた非ユニット関数のクライアントがユニットから何も参照していない場合、それは決して初期化されません。

于 2016-04-20T13:47:03.063 に答える