LNK2001:在x64平台上构建时无法解析的外部符号

LNK2001: unresolved external symbol when building for x64 platform

本文关键字:符号 外部 x64 平台 构建 LNK2001      更新时间:2023-10-16

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

完整的错误信息:dllentry。obj:错误LNK2001:未解析的外部符号"class CFactoryTemplate * g_Templates" (?g_Templates@@ 3pavcfactorytemplate @@ a)

dll .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 (myclass的主类)中项目)'CFactoryTemplate* g_Templates=0;'后面跟着'int 'g_cTemplates=0;'在文件的最上层,就在包括.

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

声明为

extern CFactoryTemplate g_Templates[];

声明g_TemplatesCFactoryTemplate的数组(大小未知)。但是你对

的定义
CFactoryTemplates* g_Templates = 0;

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

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

您需要使声明和定义一致。一种方法是写

CFactoryTemplates g_Templates[1];

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

另一种是将声明改为

extern CFactoryTemplates* g_Templates;

语句extern CFactoryTemplate g_Templates[];实际上并没有定义一个名为g_Templates的数组*;它只是声明一个存在于项目中的某个地方。你实际上是在告诉编译器"不要担心你在任何地方都看不到这个东西;当需要链接时,你可以在不同的模块中找到它。"但这显然不是真的。我能想到的两个可能的原因是:(1)包含g_Templates实际定义的文件没有包含在x64构建配置中,以及(2)定义,无论它在哪里,都被#ifdef x86之类的东西包围。

要解决这个问题,您需要找到g_Templates的实际定义(可能搜索"CFactoryTemplate g_Templates["),然后确定为什么在x64构建中省略了它。


*技术上它在这里被视为指针

相关文章: