HOWTO: Avoid Error LNK2001 Unresolved External Using DEFINE_GUIDLast reviewed: September 26, 1997Article ID: Q130869 |
The information in this article applies to:
SUMMARYA 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:
MORE INFORMATIONHere 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 // INITGUIDNote 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. |
Additional query words:
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |