Ошибка ссылки экспорта пакета 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)
директива), и он ссылается на символ в блоке. Это недопустимо, потому что если у вас есть такой символ, кто-то может связать его с импортом; и когда вызывается импорт, он вызывает код модуля. Если клиент экспортированной неединичной функции не ссылается на что-либо из модуля, он никогда не будет инициализирован.