How to avoid error "LNK2001 unresolved external" by using DEFINE_GUID (130869)
The information in this article applies to:
- Microsoft Visual C++ 2.0
- Microsoft Visual C++ 2.1
- Microsoft Visual C++ 4.0
- Microsoft Visual C++ 4.1
- Microsoft Visual C++, 32-bit Enterprise Edition 4.2
- Microsoft Visual C++, 32-bit Enterprise Edition 5.0
- Microsoft Visual C++, 32-bit Enterprise Edition 6.0
- Microsoft Visual C++, 32-bit Professional Edition 4.2
- Microsoft Visual C++, 32-bit Professional Edition 5.0
- Microsoft Visual C++, 32-bit Professional Edition 6.0
- Microsoft Visual C++, 32-bit Learning Edition 6.0
This article was previously published under Q130869 SUMMARY A GUID must be initialized exactly once. For this reason,
there are two different versions of the DEFINE_GUID macro. One version just
declares an external reference to the symbol name. The other version actually
initializes the symbol name to the value of the GUID. If you receive an LNK2001
error for the symbol name of the GUID, the GUID was not initialized.
You can make sure your GUID gets initialized in one of two ways: - If you are using precompiled header files, include the
INITGUID.H header file before defining the GUID in the implementation file
where it should be initialized. (AppWizard-generated MFC projects use
precompiled headers by default.)
- If you are not using precompiled headers, define INITGUID
before including OBJBASE.H. (OBJBASE.H is included by OLE2.H.)
MORE INFORMATION Here is the definition of DEFINE_GUID as it appears in
OBJBASE.H:
#ifndef INITGUID
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, \
b4, b5, b6, b7, b8)
EXTERN_C const GUID FAR name
#else
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, \
b4, b5, b6, b7, b8)
EXTERN_C const GUID name \
= { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }
#endif // INITGUID
Note that if the symbol INITGUID is not defined, DEFINE_GUID simply
defines an external reference to the name. In INITGUID.H, you find
(among other things):
#undef DEFINE_GUID
// Other code . . .
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, \
b4, b5, b6, b7, b8)
EXTERN_C const GUID __based(__segname("_CODE")) name \
= { l, w1, w2, { b1, b2, b3, b4, b5, b6, b7, b8 } }
By including INITGUID.H after OBJBASE.H, DEFINE_GUID is modified to
actually initialize the GUID. NOTE: It is important to make sure
that this is done exactly once for each DLL or EXE. If you try to initialize
the GUID in two different implementation files and then link them together, you
get this error: LNK2005 <symbol> already defined.
Modification Type: | Major | Last Reviewed: | 4/28/2005 |
---|
Keywords: | kbArtTypeINF kbhowto KB130869 kbAudDeveloper |
---|
|