Как из dll сделать lib

Обновлено: 06.07.2024

Можно ли автогенерировать библиотеку импорта MSVC (LIB файл) из DLL? Как?

ОТВЕТЫ

Ответ 1

Библиотекатор может использовать этот файл DEF для создания LIB:

Все имена файлов ( exports.txt , sqlite3.dll , sqlite3.def и т.д.) должны быть добавлены с полными путями.

Ответ 2

Я знаю, что тема старая, но я все еще не мог найти файл script или пакетный файл в любом месте в Интернете, чтобы сделать это. Поэтому, основываясь на ответе Dark Falcon, я сделал этот script, который вы можете сохранить как dll2lib.bat и запустить:

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

Ответ 3

Этот script создает *.lib из *.dll в% 1:

Вы можете назвать его implib.bat и запустить: implib.bat C:\folder\mydll.dll , который создает C:\folder\mydll.lib

Ответ 4

Можно ли автогенерировать библиотеку импорта MSVC (LIB файл) из DLL? Как?

В дополнение к ответу Dark Falcon Microsoft опубликовала процедуры в Как создать библиотеки импорта без .OBJs или Source.

Первая процедура Microsoft такая же, как у Dark Falcon. Вторая процедура немного более громоздка, но она показывает, как это сделать с объектным файлом с использованием заглушек. Он работает с различными соглашениями и классами вызовов.

Здесь вторая процедура из KB:

  • Когда "__declspec (dllimport)" используется в прототипе или объявлении, измените его на "__declspec (dllexport)".
  • Для функций, которые не возвращают значение, для функций C в источнике C и для C-функций в исходном коде С++ (используется с конструкцией "extern" C "), замените точку с запятой, которая завершает прототип функции с помощью совпадающая пара фигурных скобок (" <>").
  • Для функций С++ (global или member), которые возвращают значение, вы должны создать фиктивный элемент для функции и вернуть фиктивное значение соответствующего типа. (Отсутствие оператора return в функции является незаконным.) Это относится и к функциям класса. Имейте в виду, что цель этой процедуры - обмануть утилиту LIB для создания правильной библиотеки импорта, поэтому эти фиктивные тела не имеют эффекта.
  • Для классов С++ вы можете заглушить функции-члены, используя прототипы в объявлении класса, если вы отключите функцию, когда вы компилируете.
  • Функциональные аргументы обычно просто указываются типом в файле заголовка. Например, Geta (int). Идентификатор фиктивного аргумента должен быть указан при добавлении тела фиктивной функции Geta (int x). В противном случае генерируется ошибка C2055.

Ответ 5

Для тех, кто работает в Linux и хотел бы создать соответствующую библиотеку импорта (.lib) для.dll, созданной MinGW, снова нужно выполнить два шага:

  • Создать файл.def из.dll
  • Создать.lib файл из.def

Используя MSVC, можно обработать вывод dumpbin/exports foo.dll . В Linux вы должны обработать вывод objdump -p (из binutils). Сгенерированный файл определения модуля должен выглядеть следующим образом:

Чтобы преобразовать файл.def в файл.lib, используйте llvm -d lltool (MinGW (binutils) dlltool не подходит). Пример вызова для 64-битной библиотеки:

Читайте также: