What's the difference between linking against libeay32MD.lib and libeay32MT.lib?
MD
for dynamic-releaseMDd
for dynamic-debugMT
for static-releaseMTd
for static-debug
Source article via archive.org[^1].
[^1]: Original Link
These variations determine which C++ library is used, and what type of code is generated, although only 'M' is available meaning multi-threaded, there are no single-threaded options any more.
- MTd = Multi threaded debug code, and linking to C++ static debug library
- MDd = Multi threaded debug code, and linking to C++ dynamic (DLL) debug library
- MT = Multi threaded, linking to C++ static library
- MD = Multi threaded, linking to C++ dynamic (DLL) library
Just edited - sorry, codes were in wrong order.
Edit 2: More info...
These flags are C++ options and nothing to do with requiring ssleay32.dll and libeay32.dll. There are 8 version of libeay32 - 4 for a static build (no dependency on ssl/libeay32.dll) and 4 for dynamic build (requires ssl/libeay32.dll). Each of the 4 are divided into the type of C++ library required...
C++ is available to link statically or dynamically to your application, and for each of these types you can use debug libraries or release libraries.
/MT and /MTd (static) do not require the C++ redistributable code because all the C/C++ calls are contained inside your compiled program. If every module (not only ssleay & co.) you link to uses these options, your app will be fully stand-alone in terms of C++ dependencies.
/MD and /MDd (dynamic) need the C++ redistributable DLL's installed on the target computer. For /MD the releases are easily downloaded from MSFT, but you also need to note which version of Visual C++ you used - e.g. VC++ 2008, VC++ 2010 etc. there are many versions of the redistributable that you may need. For /MDd, the libraries will be on your development computer but there is no general release from MSFT for this - but you can build your own installer if necessary using Visual Studio; usually /MDd is only used by the developer for testing.
The versions of SSLEAY etc in the original question do not indicate what version 2005/2008/2010 etc of Visual C++ was used to compile the MD versions, but once compiled, it can be noted from the built target using a dependency viewer (e.g depends.exe). E.g. if your app depends on MSVCR90.DLL, then that means VC++ 9 (confusingly, that's the 2008 redistributable).
All developers need the option to choose static or DLL library linkage, here are some notes on each:
Static linkage:
- self contained, easy to install, larger code footprint, duplication of code when building multiple dll's and exe's.
Dynamic linkage:
- smaller footprint, bug fixes from MSFT updates, shared code, a bit harder to install
When you have code in a library that returns a C/C++ object (e.g. allocated memory, std::string, etc) it is mandatory to link your code with the same flags used to compile the library, with no exceptions.