0

プロジェクトは Win32 プラットフォームでビルドされますが、x64 ではビルドされません。

完全なエラー メッセージ: dllentry.obj : エラー LNK2001: 未解決の外部シンボル "class CFactoryTemplate * g_Templates" (?g_Templates@@3PAVCFactoryTemplate@@A)

dllentry.cpp は両方のプラットフォームでコンパイルされます。外部宣言が含まれています。

extern CFactoryTemplate g_Templates[];
extern int g_cTemplates;

g_Templates[] は、次の 2 つの関数で使用されます。

__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

あなたは以前の回答へのコメントで述べました

もう 1 つの有効な定義は、myClass.cpp (プロジェクトのメイン クラス) 'CFactoryTemplate* g_Templates=0;' にあります。続いて「int g_cTemplates=0;」インクルードの直後の、ファイルの最上位レベル。

of の定義は、g_Templatesその宣言と矛盾しています。

宣言は

extern CFactoryTemplate g_Templates[];

これは(未知のサイズの)g_Templates配列として宣言します。CFactoryTemplateしかし、あなたの定義

CFactoryTemplates* g_Templates = 0;

へのポインタとして定義していますがCFactoryTemplate、これは同じものではありません。

したがって、g_Templates宣言に一致する の定義を提供できませんでした。エラー メッセージは正しいです。

同意するには、宣言と定義を取得する必要があります。1つの方法は、書くことです

CFactoryTemplates g_Templates[1];

宣言と一致する定義を作成します。(C++ では長さ 0 の配列は許可されていないため、代わりに長さ 1 の配列を作成し、その要素を無視することに注意してください。)

もう1つは、宣言を次のように変更することです

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

このステートメントは、 *という名前extern CFactoryTemplate g_Templates[];の配列を実際には定義していません。プロジェクトのどこかに存在することを示しているだけです。あなたは本質的にコンパイラに「このようなものがどこにも見られなくても心配しないでください。リンクするときが来たら、別のモジュールでそれを見つけることができるでしょう」と伝えています。それが明らかに真実ではないことを除いて。考えられる 2 つの理由は、(1) の実際の定義を含むファイルがx64 ビルド構成に含まれていないこと、および (2) 定義がどこにあっても のようなもので囲まれていることです。g_Templatesg_Templates#ifdef x86

g_Templatesこれを解決するには、 (「CFactoryTemplate g_Templates[」を検索するなど)の実際の定義を見つけて、x64 ビルドで省略されている理由を特定する必要があります。


技術的にはここではポインタ扱い

于 2014-07-11T14:50:11.820 に答える