0

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

4

2 回答 2

1

您在对较早答案的评论中说

另一个有效的定义在 myClass.cpp(我的项目的主类)'CFactoryTemplate* g_Templates=0;' 其次是'int g_cTemplates = 0;' 在文件的最上层,就在包含之后。

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

声明是

extern CFactoryTemplate g_Templates[];

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

CFactoryTemplates* g_Templates = 0;

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

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

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

CFactoryTemplates g_Templates[1];

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

另一种是将声明更改为

extern CFactoryTemplates* g_Templates;
于 2014-07-11T15:21:52.517 回答
0

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

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


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

于 2014-07-11T14:50:11.820 回答