Occasionally I run into software packages for Windows that are missing some of the developer bits. One bit that occasionally gets left out is the import library. The headers are there, the .dll is there, but the .lib file is missing.
It's not impossible to generate a .lib from a .dll though.
You'll need a few things to do this:
- Microsoft Visual Studio
- A few unixish commands - echo, cat, and cut. These can be provided by a gnuwin32 installation, a cygwin installation, or just a second linux or unix system.
- A text editor. Notepad or vi will do.
I ran into this issue with Active Perl 5.20, so I'll use it in this example. Adjust accordingly.
First, dump the list of exports from the dll into an exports.in file. Open a Visual Studio command prompt and run some commands similar to the following:
cd C:\Perl64\bin dumpbin /exports perl520.dll > exports
(adjusting for the path and file name of your .dll)
Now, edit the exports file.
Trim off everything prior to the first function definition. In the perl dll, that was a line like:
1 0 000295C0 ASCII_TO_NEED
Trim off everything after the last function definition. In the perl dll, that was a line like:
1249 4E0 001271B0 win32_write
Now, use the unixish commands to create a .def file.
(If you're doing this on a second machine, then you'll need to copy the exports file over to it and then, afterwards, copy the .def file back.)
echo EXPORTS > perl520.def cat exports | cut -c27- >> perl520.def
Now, use Visual Studio's lib command to build the .lib file.
lib /def:perl520.def /OUT:perl520.lib /MACHINE:X64
Note: In this example, we had a 64-bit DLL. To build from a 32-bit DLL, use the /MACHINE:X86 flag instead.
Currently the .lib file is sitting in the bin directory, but .lib files generally need to go in a lib directory or some other place. So, move it now.
move perl520.lib ..\lib\CORE
You can now clean up if you like.
del exports del perl520.def
And that's it. You can now link against the .lib file and your app will load the .dll at runtime.
Hopefully these instructions help if you ever find yourself in a similar situation.