Как из dll сделать lib
Можно ли автогенерировать библиотеку импорта 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-битной библиотеки:
Читайте также: