Ошибка ссылки экспорта пакета C++ Builder

Я создаю проект *.bpl BPL_A, который содержит подкласс TForm, скажем, TForm_Sub.

Заголовочный файл 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_A.bpi в раздел Требуется BPL_B. Тем не менее, я получаю следующую ошибку ссылки при сборке BPL_B.

[Ошибка ILINK32] Ошибка: экспорт SomeClass::CreateUI() в модуле xxx.OBJ ссылается на __fastcall TForm_Sub::TForm_Sub() в модуле BPL_A]Form_Sub.

Я не могу понять, чего не хватает.

1 ответ

Решение

Попробуйте добавить #pragma package(smart_init) директива к исходному (xxx.cpp) файлу.

По словам C++ Builder, помогите:

Экспорт 'Symbol' в модуль 'module' ссылается на 'symbol' в модуле 'unit'

Вы пытаетесь экспортировать символ из модуля, который не является единицей (не содержит #pragma package(smart_init) директива), и он ссылается на символ в блоке. Это недопустимо, потому что если у вас есть такой символ, кто-то может связать его с импортом; и когда вызывается импорт, он вызывает код модуля. Если клиент экспортированной неединичной функции не ссылается на что-либо из модуля, он никогда не будет инициализирован.

Другие вопросы по тегам