LNK2001:构建x64平台时未解析的外部符号

时间:2014-07-11 14:34:09

标签: c++ visual-c++ 64-bit lnk2001

该项目建立在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平台构建项目?

2 个答案:

答案 0 :(得分:1)

您在对较早回答的评论中表示

  

另一个有效的定义是myClass.cpp(我的主要类)   项目)&#39; CFactoryTemplate * g_Templates = 0;&#39;然后是&#39; int   g_cTemplates = 0;&#39;在文件的最高层,就在之后   包括

您对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;

答案 1 :(得分:0)

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

要解决此问题,您需要找到g_Templates的实际定义(可能会搜索&#34; CFactoryTemplate g_Templates [&#34;)然后确定它在x64 build。


* 从技术上讲,它被视为指针

相关问题