该项目建立在Win32平台上,而不是在x64上。

完整的错误消息:
dllentry.obj:错误LNK2001:无法解析的外部符号“类CFactoryTemplate * g_Templates”(?g_Templates @@ 3PAVCFactoryTemplate @@ A)

dllentry.cpp可以在两个平台上编译。它包含外部声明:

extern CFactoryTemplate g_Templates[];
extern int g_cTemplates;


然后,在两个函数中使用g_Templates []:

__control_entrypoint(DllExport) STDAPI DllGetClassObject(__in REFCLSID rClsID,
    __in REFIID riid, __deref_out void **pv)
{
    ...
    for (int i = 0; i < g_cTemplates; i++)
    {
        const CFactoryTemplate * pT = &g_Templates[i];
    }
}




DllInitClasses(BOOL bLoading)
{
    ...
    for (int i = 0; i < g_cTemplates; i++)
    {
        const CFactoryTemplate * pT = &g_Templates[i];
    }
}


我检查了项目设置中的所有库,并且似乎都没问题,使用的是64位版本。我应该怎么做才能为x64平台构建项目?

最佳答案

您在对先前答案的评论中表示


  另一个有效的定义位于myClass.cpp(
  项目)“ CFactoryTemplate * g_Templates = 0;”其次是'int
  g_cTemplates = 0;'在文件的最上层,紧接在
  包含。


您对g_Templates的定义与其声明不一致。

声明是

extern CFactoryTemplate g_Templates[];


这将g_Templates声明为CFactoryTemplate的数组(大小未知)。但是你的定义

CFactoryTemplates* g_Templates = 0;


将其定义为指向CFactoryTemplate的指针,这不一样。

因此,您未能提供与声明匹配的g_Templates定义,并且错误消息是正确的。

您需要获得声明和定义才能同意。一种方法是写

CFactoryTemplates g_Templates[1];


创建与声明一致的定义。 (请注意,C ++中不允许使用零长度数组,因此,我们创建了一个长度为1的数组,并忽略其中的元素。)

另一个是将声明更改为

extern CFactoryTemplates* g_Templates;

关于c++ - LNK2001:为x64平台构建时无法解析的外部符号,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24700229/

10-11 16:15