Импорт DLL из другого компилятора - PullRequest
0 голосов
/ 17 января 2012

Я скомпилировал библиотеку, которую я создал с MinGW, в существующее приложение с использованием Borland 6 (я знаю, что оно старое, но это то, с чем оно было сделано).Я использовал implib для создания файла .lib и импортировал его в свой проект.Я также добавил пути к DLL и необходимые файлы заголовков.

Когда я пытаюсь скомпилировать, я получаю кучу неразрешенных ошибок внешнего типа.Я пропустил какие-либо шаги в процессе импорта?Если предположить, что у меня нет, и проблема в том, что искажение имен - как мне написать интерфейс так, чтобы искажение имен не имело значения.Я знаю, что это касается extern C, но это предел моих знаний.Есть только два класса, которые должны быть доступны извне DLL, остальные все используются только для внутреннего использования.Я не уверен, как использовать extern C с чем-то, что полностью построено с классами.Я все еще надеюсь, что это мой импорт с Borland 6.

Ответы [ 2 ]

0 голосов
/ 17 января 2012

extern "C" не может использоваться для классов, только для свободных функций. Таким образом, у вас есть возможность написать интерфейс «C» для вашего класса, где каждая функция берет указатель на ваш класс, и у вас, вероятно, будут функции создания и уничтожения.

Обычно это делается так, и ваш класс может быть заранее объявлен как struct, которая аналогична классу, а затем может даже использоваться приложениями, написанными на C. Обычно вы ставите только extern "C" когда __cplusplus определен так, обычно вокруг него стоят охранники #ifdef.

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

Пользователи DLL используют абстрактный интерфейс и все еще используют методы Create и Destroy (с extern "C") для создания указателя на абстрактный интерфейс, но затем используют указатель обычным способом C ++. Конечно, в идеале вы должны обернуть этот указатель в умный указатель, например, повышение shared_ptr с пользовательским средством удаления, которое вызывает метод Destroy. (Пользователи библиотеки должны сделать это, но вы можете предоставить интерфейс только для заголовков, чтобы сделать это).

Есть несколько других проблем, о которых вам следует остерегаться, например, например, все, что связано с информацией о типах во время выполнения, вероятно, не будет работать на стороне пользователя, включая исключения. И снова ваша библиотека может предоставить «обертки» C ++ с открытым исходным кодом (скомпилированные на стороне клиента), чтобы обрабатывать это более C ++. Этакий pImpl.

0 голосов
/ 17 января 2012

Название искажения не стандартизировано по компиляторам.Экспонируйте только функции extern C , чтобы они не были искажены.Но это имеет ограничение, заключающееся в том, что вы не можете использовать объектно-ориентированное программирование.

Другой вариант заключается в реализации COM-объектов, поскольку они двоично совместимы.

...