Подтвердить что ты не робот

Связь с MSVC DLL от MinGW

Я пытаюсь связать LizardTech GeoExpress DSDK в моем собственном приложении. Я использую gcc, чтобы мы могли компилироваться для платформ. В Linux и Mac это работает легко: они предоставляют статическую библиотеку (libltidsdk.a) и заголовки, и все, что нам нужно сделать, это использовать их.

Компиляция для окон не так проста. Они построили библиотеку с помощью Microsoft Visual Studio, и мы используем MinGW. Я читал FAQ MinGW, и я столкнулся с проблемами ниже. Библиотека - это все С++, поэтому мой первый вопрос: возможно ли это?

Просто связывание с dll, как указано, дает "undefined reference" ошибки для всех вызовов С++ (конструкторы, дескрипторы, методы и т.д.).

На основе MinGW Wiki: http://www.mingw.org/wiki/MSVC%5Fand%5FMinGW%5FDLLs Я должен использовать утилиту reimp для преобразования .lib во что-то пригодное. Я пробовал все .lib файлы, предоставленные LizardTech, и все они дают "недопустимую или поврежденную библиотеку импорта". Я пробовал обе версии 0.4 и 0.3 утилиты reimp.

Используя второй метод, описанный в wiki, я запустил pexport и dlltool через dll, чтобы получить архив .a, но это приводит к тем же ссылкам undefined.

BTW: Я прочитал обсуждение ниже. Это оставило некоторую двусмысленность относительно того, возможно ли это, и с учетом страницы Wiki MinGW кажется, что это должно быть выполнимо. Если это невозможно, это все, что мне нужно знать. Если это можно сделать, я хотел бы знать, как я могу добиться этого.

Как установить ссылку на VS2008 сгенерированные .libs из g++

Спасибо!

4b9b3361

Ответ 1

Вы не можете этого сделать. Они экспортировали классы С++ из своей dll, а не C-функции. Разница заключается в том, что функции С++ всегда экспортируются с именами в искаженной форме, специфичной для конкретной версии компилятора.

Их dll можно использовать с помощью msvc только в этой форме и, вероятно, даже не будет работать между различными версиями msvc, поскольку Microsoft ранее изменила свою схему управления.

Если у вас есть рычаги, вам нужно заставить их изменить свои злые пути. В противном случае вам нужно будет использовать MSVC для записи dll dim, который будет импортировать все классы и повторно экспортировать их через c-функции, возвращающие интерфейсы.

Ответ 3

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

Ответ 4

Чтобы использовать DLL в Windows, вы связываетесь с библиотекой импорта (а не самой DLL). Библиотеки импорта обычно имеют расширение .lib(как и статические библиотеки). Если вы загрузите Windows SDK, вы получите библиотеки импорта для всех системных DLL.

Из вашего вопроса, похоже, что вы, возможно, перепутали .dll с .lib. Вы уверены, что reimp не принимает DLL в качестве входных данных и создает библиотеку импорта .LIB, совместимую с MinGW?

Я только что посмотрел с помощью MinGW в Википедии. Согласно этой статье, MinGW поставляется с распространяемыми библиотеками импорта.