How to link a .DLL statically?

42,096

Solution 1

In the C++ project file for the dll, create two configurations, one that generates a DLL and one that generates a .lib. Two projects are not necessary, since any .NET/C++ project can support multiple build configurations (this is how Release and Debug versions build differently).

Solution 2

Another option is to have two projects, one project will output a .lib which can be statically linked, and a second project which will output a .dll and will have your .lib as dependency, you should add .def to your .dll with the symbols that you are planning to export, or else it will be empty.

Solution 3

Pick up a copy of DLL to Lib (Edit: If you can't find a cheaper option)

Solution 4

You can generate a dll and export the entry point to a lib using dllexport, this is explained here

http://msdn.microsoft.com/en-us/library/3y1sfaz2.aspx

Share:
42,096
mmmmmmmm
Author by

mmmmmmmm

Updated on July 17, 2022

Comments

  • mmmmmmmm
    mmmmmmmm almost 2 years

    We have a (pure native C++) .DLL that is build by VS. As clients we have some native C++ applications and a .Net-Wrapper around this DLL written in C++/CLI. Finally there are some client applications for the .Net-Wrapper written in C#.

    My problem is that the native.dll must be distributed in a different way than the .Net world works and the VS does not keeps track of that DLL. So to let all my C# Apps work correctly I have to copy it to each executable directory or put it somwhere in %PATH% (which I would avoid on developer computers since they may want to start different apps with different versions of the DLL). Even bigger problems occur if there are UserControls that reference the Wrapper-DLL: You have to copy the DLL to VS's directory or again to %PATH%. But the worst case occurs with our Translator tool. This tool keeps track of .Net-Assemblies and packs them into Translator-packages that can be send to an external translator. As far as I know there is no way to put the native .DLL into that package!

    So I plan to link the native DLL statically into the .Net-Wrapper which would solve my problems. But for our Native applications this native DLL must still be a DLL.

    So I have two options:

    • Make two projects of that (one that generates a static library; and one that creates a dynamic one => I try to avoid this)
    • Find a solution to link DLLs statically
    • Find a way to let VS generate two outputs from one project