簡體   English   中英

從 x86 更改為 x64 后的鏈接器錯誤

[英]linker error after changing from x86 to x64

當我嘗試構建項目 gwmeta 時出現此錯誤:

Build started 20.03.2020 10:54:54.
     1>Project "C:\Users\Yil\Desktop\EP2000\Rel19-x64\gwmeta\gwmeta.vcxproj" on node 2 (Build target(s)).
     1>Link:
         C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\bin\x86_amd64\link.exe /ERRORREPORT:PROMPT /OUT:"C:\Users\Yil\Desktop\EP2000\Rel19-x64\x64\Debug\gdmeta.dll" /INCREMENTAL /NOLOGO /LIBPATH:"C:\Program Files (x86)\Visual Leak Detector\lib\Win32" kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /MANIFEST /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /manifest:embed /DEBUG /PDB:"C:\Users\Yil\Desktop\EP2000\Rel19-x64\x64\Debug\gdmeta.pdb" /SUBSYSTEM:WINDOWS /TLBID:1 /DYNAMICBASE /NXCOMPAT /IMPLIB:"C:\Users\Yil\Desktop\EP2000\Rel19-x64\x64\Debug\gdmeta.lib" /MACHINE:X64 /DLL x64\Debug\gwmeta.res
         x64\Debug\gwmeta.obj
         x64\Debug\winmeta.obj
         "C:\Users\Yil\Desktop\EP2000\Rel19-x64\x64\Debug\gdbase.lib"
         "C:\Users\Yil\Desktop\EP2000\Rel19-x64\x64\Debug\gdcore.lib"
            Creating library C:\Users\Yil\Desktop\EP2000\Rel19-x64\x64\Debug\gdmeta.lib and object C:\Users\Yil\Desktop\EP2000\Rel19-x64\x64\Debug\gdmeta.exp
     1>winmeta.obj : error LNK2019: unresolved external symbol "int __cdecl MetaEnumProc(void *,struct tagHANDLETABLE *,struct tagMETARECORD *,int,__int64)" (?MetaEnumProc@@YAHPEAXPEAUtagHANDLETABLE@@PEAUtagMETARECORD@@H_J@Z) referenced in function "protected: void __cdecl MetaFile::GetMetaFileAndEnum(void *)" (?GetMetaFileAndEnum@MetaFile@@IEAAXPEAX@Z)
     1>C:\Users\Yil\Desktop\EP2000\Rel19-x64\x64\Debug\gdmeta.dll : fatal error LNK1120: 1 unresolved externals
     1>Done Building Project "C:\Users\Yil\Desktop\EP2000\Rel19-x64\gwmeta\gwmeta.vcxproj" (Build target(s)) -- FAILED.

Build FAILED.

Time Elapsed 00:00:00.19

這是錯誤來自:

void MetaFile::GetMetaFileAndEnum(HDC hDC)
{

    // if there is a valid handle to a metafile begin enumerating it
    if (hMF)
    {
#ifdef __WIN16__
        FARPROC lpprocEnumMF = MakeProcInstance((FARPROC)MetaEnumProc,
                                                GwInstance());
        EnumMetaFile(hDC, hMF, (FARPROC)lpprocEnumMF, (LPARAM) this);
        FreeProcInstance ((FARPROC) lpprocEnumMF);
#else

        if (bEnhanced)
        {
            RECT r;
            GetClientRect (WindowFromDC(hDC),&r);
            EnumEnhMetaFile(hDC, hMF, (ENHMFENUMPROC)EnhMetaEnumProc, (LPVOID) this,&r);
        }
        else
            EnumMetaFile(hDC, hMF, static_cast<MFENUMPROC>(MetaEnumProc), (LPARAM) this);
#endif

    }
    else
    {
        GwCore::warning (GwERR_METAFILE_FAILED,"GetMetaFile failed");
    }
}

當我刪除行EnumMetaFile(hDC, hMF, static_cast<MFENUMPROC>(MetaEnumProc), (LPARAM) this); 它建立。 MetaEnumProc 顯然是這里的問題。

我注意到另一件事:

鏈接器錯誤

winmeta.obj 紅色字段中的路徑是錯誤的。 winmeta.obj 在 ..\\gwmeta\\x64\\Debug\\winmeta.obj 而不是在 ..\\gwmeta\\winmeta.obj

我所有的項目都設置為 x64。 我還多次重建和清理我的解決方案。 我正在 VS2012 上工作,我也嘗試使用 VS2019 進行構建,但問題仍然存在。

如果有幫助,這是鏈接器->命令行視圖:

    /OUT:"C:\Users\Yil\Desktop\EP2000\Rel19-x64\x64\Debug\gdmeta.dll" /MANIFEST /NXCOMPAT 
/PDB:"C:\Users\Yil\Desktop\EP2000\Rel19-x64\x64\Debug\gdmeta.pdb" /DYNAMICBASE "kernel32.lib" 
"user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib"
 "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" "C:\Users\Yil\Desktop\EP2000\Rel19-
x64\x64\Debug\gdbase.lib" "C:\Users\Yil\Desktop\EP2000\Rel19-x64\x64\Debug\gdcore.lib" 
/IMPLIB:"C:\Users\Yil\Desktop\EP2000\Rel19-x64\x64\Debug\gdmeta.lib" /DEBUG /DLL /MACHINE:X64 
/INCREMENTAL /PGD:"C:\Users\Yil\Desktop\EP2000\Rel19-x64\x64\Debug\gdmeta.pgd" /SUBSYSTEM:WINDOWS
 /MANIFESTUAC:"level='asInvoker' uiAccess='false'" 
/ManifestFile:"x64\Debug\gdmeta.dll.intermediate.manifest" /ERRORREPORT:PROMPT /NOLOGO 
/LIBPATH:"C:\Program Files (x86)\Visual Leak Detector\lib\Win32" /TLBID:1 

MetaEnumProc 定義在與上面的 winmeta.cxx 代碼相同的文件中

#ifdef __WIN16__
int FAR PASCAL __export MetaEnumProc(HDC hDC, LPHANDLETABLE lpHTable,
                                        LPMETARECORD lpMFR, int nObj,
                                        BYTE FAR* lpClientData)
#else
int CALLBACK  MetaEnumProc(HDC hDC, LPHANDLETABLE lpHTable,
        LPMETARECORD lpMFR, int nObj,
        LPARAM UNUSED (lpClientData))
#endif
{

    if ((lpMFR->rdFunction == 0x0234) &&
        (lpMFR->rdParm[0] == 0))
    {
         lpMFR->rdParm[0] = 1;
    }


    // Play the record
    PlayMetaFileRecord(hDC, lpHTable, lpMFR, (WORD)nObj);


    // if we made it this far then continue the enumeration
    return(1);

}

它以前在 x32 中工作過,但該程序在 x64 上有問題。

我發現了問題:

MFENUMPROC希望第三個參數是METARECORD *LPMETARECORD並不完全相同; LPMETARECORD__aligned 所以我改變了這個

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM