Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Windows & C++: extern & __declspec(dllimport)

What is the difference/relationship between "extern" and "__declspec(dllimport")? I found that sometimes it is necessary to use both of them, sometimes one is enough.

Am I right that:

  1. "extern" is for statically linked libraries,
  2. "__declspec(dllimport)" is for DLL (dynamically linked libraries),
  3. both do actually the same job for their respective type of linking,
  4. you need to use both when you use import libraries (small .lib files that help linking with dll)?
like image 622
liori Avatar asked Feb 18 '10 11:02

liori


People also ask

Can I get Windows for free?

Microsoft allows anyone to download Windows 10 for free and install it without a product key. It'll keep working for the foreseeable future, with only a few small cosmetic restrictions.

Will there be a Windows 12?

Assuming Microsoft sticks to the three-year update cycle Windows Central's Zac Bowden reports, Windows 12 would be released at some point in 2024.

Do I want Windows 11 yet?

Windows 11 is worth it for most people. It comes with a wide range of new features, performance improvements, and design changes. As the latest Windows OS, it usually gets more attention than Windows 10, too. There's not too much risk in upgrading to Windows 11, either.

Is Microsoft Windows and Windows the same?

Microsoft Windows, also called Windows and Windows OS, computer operating system (OS) developed by Microsoft Corporation to run personal computers (PCs). Featuring the first graphical user interface (GUI) for IBM-compatible PCs, the Windows OS soon dominated the PC market.


1 Answers

extern means that the entity has external linkage, i.e. is visible outside its translation unit (C or CPP file). The implication of this is that a corresponding symbol will be placed in the object file, and it will hence also be visible if this object file is made part of a static library. However, extern does not by itself imply that the symbol will also be visible once the object file is made part of a DLL.

__declspec(dllexport) means that the symbol should be exported from a DLL (if it is indeed made part of a DLL). It is used when compiling the code that goes into the DLL.

__declspec(dllimport) means that the symbol will be imported from a DLL. It is used when compiling the code that uses the DLL.

Because the same header file is usually used both when compiling the DLL itself as well as the client code that will use the DLL, it is customary to define a macro that resolves to __declspec(dllexport) when compiling the DLL and __declspec(dllimport) when compiling its client, like so:

#if COMPILING_THE_DLL     #define DLLEXTERN __declspec(dllexport) #else     #define DLLEXTERN __declspec(dllimport) #endif 

To answer your specific questions:

  1. Yes, extern alone is sufficient for static libraries.
  2. Yes -- and the declaration also needs an extern (see explanation here).
  3. Not quite -- see above.
  4. You don't strictly need the extern with a __declspec(dllimport) (see explanation linked to above), but since you'll usually be using the same header file, you'll already have the extern in there because it's needed when compiling the DLL.
like image 155
Martin B Avatar answered Oct 10 '22 19:10

Martin B