создать библиотеку импорта MSVC с помощью инструментов MinGW

В настоящее время мы переключаем процесс сборки W32 кроссплатформенного (linux, osx, w32) проекта с VisualStudio на mingw.

Одна из проблем, с которыми мы сталкиваемся, заключается в том, что наши проекты создают динамическую библиотеку (foo.dll), с которой могут связываться сторонние проекты. Чтобы это работало на W32/MSVC, требуется библиотека импорта (foo.lib).

Теперь, следуя документации, довольно легко создать файл .def, содержащий всю информацию. требуется для импорта библиотеки:

 gcc -shared -o foo.dll foo-*.o -Wl,--output-def,foo.def

Чтобы использовать файл foo.def, документы говорят мне использовать инструмент Microsoft LIB для создания из него файла foo.lib:

 lib /machine:i386 /def:testdll.def

Это, очевидно, требует, чтобы на компьютере сборки был установлен (подмножество) MSVC. Однако мы хотели бы выполнить кросс-компиляцию всего этого в наших Linux-системах (возможно, даже в некоторых CI), что делает установку MSVC довольно утомительной.

Поэтому мне интересно, есть ли собственный способ MinGW для преобразования файла foo.def в библиотеку импорта foo.lib?

(Мы понимаем, что, в конце концов, только пользователям MSVC требуется библиотека импорта, и что у них будет готовый инструмент lib. Однако, поскольку мы всегда поставляли файл foo.lib, переход на foo.def может нарушить работу сторонних систем сборки — чего мы хотели бы избежать).


person umläute    schedule 28.11.2017    source источник


Ответы (2)


Чтобы создать библиотеку импорта, похожую на библиотеку, созданную Microsoft link.exe, вы можете использовать llvm-dlltool (часть проекта компилятора LLVM):

llvm-dlltool -m i386:x86-64 -d foo.def -l foo.lib

Замените i386:x86-64 на i386, если вы хотите создать 32-битную библиотеку. Дополнительные сведения см. в этом ответе на вопрос Как создать библиотеку импорта (LIB-файл) из DLL?.

Обратите внимание, что некоторые проекты MinGW генерируют файл .dll.a (созданный binutils dlltool). Хотя это можно было бы переименовать в .lib и использовать как библиотеку импорта, я обнаружил, что это приведет к повреждению двоичных файлов, если проекты MSVC ссылаются на несколько библиотек .dll.a. Так что используйте llvm-dlltool для улучшения совместимости.

person Lekensteyn    schedule 18.12.2018

мы хотели бы кросс-компилировать все это на наших Linux-системах

Я не знаю ни одного клона MS LIB, переносимого на Linux, однако POLIB из дистрибутива Pelles C является бесплатным , небольшой, автономный и совместимый с инструментом MS. У него нет никаких зависимостей, кроме kernel32.dll, так что, я думаю, он будет работать и под Wine.

person Matt    schedule 02.01.2018