该项目建立在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平台构建项目?
答案 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。
* 从技术上讲,它被视为指针