Интернет, компьютеры, софт и прочий Hi-Tech

Подписаться через RSS2Email.ru

Генерация .lib из DLL с помощью Visual Studio

Программисты часто имеют дело со сторонними DLL, написанными третьими лицами, функции которых нужны при разработке. Это разумно и полезно, поскольку до тех пор, пока интерфейс DLL остается прежним, слинкованные с ней другие DLL-и могут легко заменяться без повторной компиляции и пересборки кода.

Однако, в Visual Studio чтобы прилинковать к коду стороннюю библиотеку, нужно иметь файл .lib, — самой по себе DLL для этой задачи недостаточно. К счастью, существует способ сгенерировать .lib из DLL с помощью Visual Studio. Создание файла .lib напоминает реверс-инжиниринг содержимого DLL.

Биржа долевых инвестиций SIMEX.

Публикация сокращена для удобства обсуждения.
Полная версия: Генерация .lib из DLL с помощью Visual Studio

Метки материала: генерация, lib, dll, помощь, visual, studio, генерация lib, visual studio, lib из dll, dll с помощью visual studio, для windows, формат, форматы, по, софт, software, разработка по, софт для windows, документация для программиста, программное обеспечение


9 комментариев

19.01.2012 17:45:08 #
Mozilla Firefox Гость
А вот как прилинковать dll, скомпилированный VS, в проект, собираемый с помощью mingw?
Смысл - включить в общую сборку проекта под линуксом мастадайного клиента.
19.01.2012 18:44:05 #
Mozilla Firefox dima
Про скомпилированные конкретно под VS не знаю, но однажды пришлось прилинковывать стороннюю DLL, написанную под Delphi, к своей библиотеке на C, компилируемой под MinGW. Если это удалось, то думаю и с VS такое прокатит.
 
Пусть дана example.dll с функциями ExampleFunction1, ExampleFunction2 и ExampleFunction3. Моя библиотека являлась расширением к SQLite. Делаем следующее:
  1. Пишем файл заголовка example.h типа следующего:
    C
    #include <windows.h>
     
    __declspec(dllimport) int ExampleFunction1(void);
    __declspec(dllimport) PChar ExampleFunction2(DWORD RK, PChar pin);
    __declspec(dllimport) int ExampleFunction3(PChar pin, PChar key);

  2. Создаем файлы example.def и example.lib, как описано в данной статье.
     
  3. Включаем в свой код
    C
    #include "example.h"

  4. Компилируем свою библиотеку командой
    Bash
    gcc -shared -Isqlite3 -o mylib.dll mylib.c -lexample
19.01.2012 19:23:54 #
Mozilla Firefox Гость
Там проблема в том, что они C++ - ые. А у VS конвенция имен кое-где другая.
19.01.2012 21:07:38 #
Mozilla Firefox dima
Гугл говорит, что в def-файл можно добавить алиасы проблемных функций. Например, так:
Text
LIBRARY "xyz.dll"
EXPORTS
MyProblemFunction
_MyProblemFunction@4 = MyProblemFunction

А файл lib генерировать уже с помощью этого def.
Не знаю, поможет ли Вам это, мне к алиасам прибегать не приходилось.
10.09.2013 20:23:55 #
Google Chrome Гость jhon
Спасибо огромное, и как раз попал сюда в поисках sqlite3.lib Very we!
11.09.2013 14:00:14 #
Mozilla Firefox dima
Пожалуйста Well
08.07.2014 13:53:21 #
Google Chrome Гость гость
Благодарю, очень помогла статья
02.06.2015 21:39:43 #
Google Chrome Гость Гость
Автору спасибо!
12.11.2019 16:30:27 #
Mozilla Firefox Гость
Откорректированный код скрипта:
 
$pattern = "\s+([A-Z0-9]+)\s+[A-Z0-9]+\s+[A-Z0-9]{8} (Ctm.*)";
$platform = "x86";
 
if($args.length)
{
   if($args[1])
   {
       $platform = $args[1];
   }
 
   $dll = [System.IO.Path]::GetFilename($args[0]);
   $def = [System.IO.Path]::ChangeExtension($dll, "def");
   $lib = [System.IO.Path]::ChangeExtension($dll, "lib");
 
   Write-Host ("Generating " + $def + " file…");
   "EXPORTS" > $def;
   &"dumpbin" "/exports" $args[0] | select-string $pattern | %{$null = $_.Line -match $pattern; $str='{0,9}{1,-30} @{2}' -f " ", $matches[2], $matches[1]; $str >> $def; }
 
   Write-Host ("Generating " + $lib + " file…");
   &"lib" ("/def:" + $def) ("/out:" + $lib) ("/machine:" + $platform) | out-null;
 
   Write-Host ("");
}
else
{
   Write-Host "Start powershell from VisualStudio commandline then use this script.";
   Write-Host "Script takes two parameters: dll filename and platform.";
   Write-Host "example: .\GenerateLibFromDll.ps1 hello.dll `"x64`"";
   Write-Host "or to process all dlls in the dir: gci *.dll | foreach {&`".\GenerateLibFromDll.ps1`" $_.Name `"x64`"}";;
}

Оставьте, пожалуйста, свой комментарий к публикации

Представиться как     Антибот:
   

Просьба не постить мусор. Если вы хотите потестить xBB, воспользуйтесь кнопкой предварительного просмотра на панели инструментов xBBEditor-а.


© 2007-2019, Дмитрий Скоробогатов.
Разрешается воспроизводить, распространять и/или изменять материалы сайта
в соответствии с условиями GNU Free Documentation License,
версии 1.2 или любой более поздней версии, опубликованной FSF,
если только иное не указано в самих материалах.