Ссылка на MSVC DLL от MinGW - PullRequest
       50

Ссылка на MSVC DLL от MinGW

28 голосов
/ 18 марта 2010

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

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

Простое связывание с dll, как предусмотрено, приводит к ошибкам «неопределенная ссылка» для всех вызовов C ++ (конструкторы, десктрукторы, методы и т. Д.).

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

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

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

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

Спасибо!

Ответы [ 4 ]

23 голосов
/ 18 марта 2010

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

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

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

3 голосов
/ 18 марта 2010

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

0 голосов
/ 27 августа 2018

Просто подумал, что я бы добавил сюда свои два цента.

Когда вы хотите связать dll в MSVC, то вы делаете связывание с .lib, который содержит заглушки функций, которые в свою очередь вызывают соответствующую функцию в .dll (дополнительное косвенное обращение с добавлением «__imp__» к искаженному название). GCC этого не делает, потому что теоретически вы можете легко связать напрямую с dll, если функции представлены в таблице экспорта. Вы можете указать GCC в MinGW, чтобы он смотрел в dll напрямую, используя -l. Это правда, что схема именования C ++ различается в разных версиях MSVC, но не во всех. Они согласуются с большинством версий, и расширения добавляются по мере внедрения новых функций.

MinGW, однако, использует схему искажения имени GCC, которая включает в себя поиск внешних символов, поэтому он не распознает искаженные имена MSVC. Компоновщик может легко решить эту проблему, изменив сопоставление внешних символов, чтобы они соответствовали MSVC, и затем снова проверьте, есть ли совпадение. Возможно, это когда-нибудь будет реализовано. Я решил это на своем собственном языке программирования аналогичным образом, но он, конечно, включает мой собственный компоновщик.

Полностью возможно предоставить GCC в MinGW .lib, просто укажите его в командной строке так же, как вы указываете исходные файлы; gcc -o test.cpp main.cpp external.lib … Это предоставит компоновщику искаженные имена, которые он должен искать. MinGW также может работать с искаженными именами MSVC, в libmangle даже есть свой собственный manvler / demangler MSVC.

0 голосов
/ 18 марта 2010

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

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

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

...