Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to build a DLL from the command line in Windows using MSVC

People also ask

How do I link a DLL to Msvc?

On Windows you do not link with a . dll file directly – you must use the accompanying . lib file instead. To do that go to Project -> Properties -> Configuration Properties -> Linker -> Additional Dependencies and add path to your .

When DLL file is created in C#?

A Dynamic Link library (DLL) is a library that contains functions and codes that can be used by more than one program at a time. Once we have created a DLL file, we can use it in many applications. The only thing we need to do is to add the reference/import the DLL File.


On the command line use:

cl.exe /LD <files-to-compile>

or, if you prefer the more verbose & explicit version:

cl.exe /D_USRDLL /D_WINDLL <files-to-compile> <files-to-link> /link /DLL /OUT:<desired-dll-name>.dll

Turns out it happens automatically.

If you have exported functions (e.g. /export, __declspec(dllexport), etc) the linker will automatically generate the .lib file (you do of course need /dll on the linker command line).


Simlar to Ebow Halm's answer, but using a .def file for listing the exported functions and newer command line arguments:

"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\vcvars32.bat" && cl /O2 /Iall /Iyour /Iincludes /D_USRDLL /D_WINDLL /DOTHER_DEFINES <libs> <source files> /LD /Fe<dll name> /link /DEF:<def name>.def

References:

  • https://msdn.microsoft.com/en-us/library/34c30xs1.aspx
  • https://msdn.microsoft.com/en-us/library/19z1t1wy.aspx

Does cl need any additional arguments, to indicate it is compiling for a DLL? (I know the DLL exported prototypes need __declspec(dllexport)).

Not since Win3x went away, now you just just need either __declspec(dllexport) or a .DEF file which defines the names of the symbols you want exported. a .def file allows you to export symbols with modified names, so it can still be useful for special cases.

I know link needs /dll as an argument.

Yep.

Will I run lib and link, to produce the .lib and .dll respectively, or will link produce both?

lib is used only to create static libraries (or to add .objs to your implib) Link will produce both a .dll and an import .lib for it.