Построить два взаимозависимых DLL - PullRequest
0 голосов
/ 16 июля 2009

У меня есть взаимозависимая dll, которую я хотел бы построить, не создавая их дважды (принудительно соберите их обоих и перестроите заново, чтобы разрешить связывание).

Вот пример:

**DLL A**

void fooA()
{
  fooBB();
}
void fooAA()
{
  fooB();
}

**DLL B**

void fooB()
{
  fooA();
}

void fooBB()
{
}

Есть ли способ построить эти две DLL без рефакторинга мэра?

Ответы [ 2 ]

1 голос
/ 16 июля 2009

Вы можете использовать LoadLibary и GetProcAddr, чтобы найти адреса функций, а затем вызывать foo-функции по их адресам.

Следующий код демонстрирует, как это сделать (вы должны добавить проверку ошибок в реальных DLL):

**DLL A**

typedef void fooB(void);
typedef void fooBB(void);
fooB* fooB_ptr;
fooBB* fooBB_ptr;
HMODULE hDllB;

void init()
{
  hDllB = LoadLibrary(L"DllB.dll");
  fooB_ptr = reinterpret_cast<fooB*>(GetProcAddr( hDllB, L"fooB" ));
  fooBB_ptr = reinterpret_cast<fooBB*>(GetProcAddr( hDllB, L"fooBB" ));
}

void done()
{
  FreeLibrary( hDllB );
}

void fooA()
{
  fooBB_ptr();
}
void fooAA()
{
  fooB_ptr();
}

То же самое в DLL B.

0 голосов
/ 16 июля 2009

Вы на самом деле перестраиваете обе библиотеки DLL каждый раз, когда компилируете?

Если нет, библиотеки импорта должны создаваться в первый раз - даже если фаза соединения терпит неудачу из-за неразрешенных внешних факторов - и разрешать последующим сборкам связываться без ошибок ...

edit: у нас на самом деле есть такие зависимости в моем магазине. Наша сборка действительно является инкрементной, и для успешной компоновки чистых сборок требуется несколько проектов, которые должны быть собраны несколько раз.

...