David Grayson
David Grayson

Reputation: 87376

How do I build an import library (.lib) AND a DLL in Visual C++?

I want to have a single Visual Studio project that builds a DLL file and an import library (.lib) file. (An import library is a statically-linked library that takes care of loading that DLL file in other projects that use it).

So I went to Visual Studio C++ 2008 Express Edition, created a New Project of type Class Library, and set the "Configuration Type" to be "Dyanamic Library (.dll)".

But when I build the solution, the only relevant output file I see is a DLL file; I don't see any LIB file getting generated. I looked in the project directory and all subdirectories (Release and Debug).

I believe that it is possible to build a LIB and a DLL file at the same time because on the MSDN it says "The linker creates the import library when the DLL is built." Also, another user of this website is creating LIB and DLL files at the same time using Visual C++.

So how can I do it?

Upvotes: 85

Views: 155070

Answers (5)

Tirsvad
Tirsvad

Reputation: 158

I have a working example for Visual Studio 2022

Source code

There are some configuration step at mainapp project in vs2022

  1. Configuration Properties > C/C++ > General > Additional Include Directories (path to your headerfiles in dll project)
  2. Configuration Properties > Linker > Input (.lib file from dll project)

If the dll project is not in the same solution there is more configuration to be done!

Upvotes: 0

Thom
Thom

Reputation: 15042

OK, so I found the answer from http://binglongx.wordpress.com/2009/01/26/visual-c-does-not-generate-lib-file-for-a-dll-project/ says that this problem was caused by not exporting any symbols and further instructs on how to export symbols to create the lib file. To do so, add the following code to your .h file for your DLL.

#ifdef BARNABY_EXPORTS
#define BARNABY_API __declspec(dllexport)
#else
#define BARNABY_API __declspec(dllimport)
#endif

Where BARNABY_EXPORTS and BARNABY_API are unique definitions for your project. Then, each function you export you simply precede by:

BARNABY_API int add(){
}

This problem could have been prevented either by clicking the Export Symbols box on the new project DLL Wizard or by voting yes for lobotomies for computer programmers.

Upvotes: 43

Chris Long Gue
Chris Long Gue

Reputation: 91

you also should specify def name in the project settings here:

Configuration > Properties/Input/Advanced/Module > Definition File

Upvotes: 9

Joe
Joe

Reputation: 2976

By selecting 'Class Library' you were accidentally telling it to make a .Net Library using the CLI (managed) extenstion of C++.

Instead, create a Win32 project, and in the Application Settings on the next page, choose 'DLL'.

You can also make an MFC DLL or ATL DLL from those library choices if you want to go that route, but it sounds like you don't.

Upvotes: 24

Michael Burr
Michael Burr

Reputation: 340168

Does your DLL project have any actual exports? If there are no exports, the linker will not generate an import library .lib file.

In the non-Express version of VS, the import libray name is specfied in the project settings here:

Configuration Properties/Linker/Advanced/Import Library

I assume it's the same in Express (if it even provides the ability to configure the name).

Upvotes: 90

Related Questions