代理DLL中未解决的外部符号

3

我正在尝试为 'Version.dll' 构建代理 DLL,但一直遇到与导出函数相关的错误。

00000000 characteristics
4A5BC9E3 time date stamp Tue Jul 14 05:27:23 2009
    0.00 version
       1 ordinal base
      15 number of functions
      15 number of names

ordinal hint RVA      name

      1    0 00001B14 GetFileVersionInfoA
      2    1 00001E40 GetFileVersionInfoByHandle
      3    2 0000193C GetFileVersionInfoExW
      4    3 00001AB4 GetFileVersionInfoSizeA
      5    4 000014E8 GetFileVersionInfoSizeExW
      6    5 000015FC GetFileVersionInfoSizeW
      7    6 00001614 GetFileVersionInfoW
      8    7 00002820 VerFindFileA
      9    8 00003F50 VerFindFileW
     10    9 00002AF0 VerInstallFileA
     11    A 000043F8 VerInstallFileW
     12    B          VerLanguageNameA (forwarded to KERNEL32.VerLanguageNameA)
     13    C          VerLanguageNameW (forwarded to KERNEL32.VerLanguageNameW)
     14    D 00001B94 VerQueryValueA
     15    E 000015E0 VerQueryValueW

我的代码看起来像这样:

extern "C"
{
    BOOL WINAPI DllMain(HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
    {
        if (dwReason == DLL_PROCESS_ATTACH)
        {
            DisableThreadLibraryCalls((HMODULE)hDllHandle);

            // do stuff
        }

        return TRUE;
    }

DWORD APIENTRY Wrapper_GetFileVersionInfoSizeExA(__in DWORD dwFlags, __in LPCSTR lpwstrFilename, __out LPDWORD lpdwHandle)
    {
        return ::GetFileVersionInfoSizeExA(dwFlags, lpwstrFilename, lpdwHandle);
    }

// and so on for the rest
}

导出定义文件:
LIBRARY Version
EXPORTS
GetFileVersionInfoA=Wrapper_GetFileVersionInfoA
GetFileVersionInfoByHandle=Wrapper_GetFileVersionInfoByHandle
GetFileVersionInfoExW=Wrapper_GetFileVersionInfoExW
GetFileVersionInfoSizeA=Wrapper_GetFileVersionInfoSizeA
GetFileVersionInfoSizeExW=Wrapper_GetFileVersionInfoSizeExW
GetFileVersionInfoSizeW=Wrapper_GetFileVersionInfoSizeW
GetFileVersionInfoW=Wrapper_GetFileVersionInfoW
VerFindFileA=Wrapper_VerFindFileA
VerFindFileW=Wrapper_VerFindFileW
VerInstallFileA=Wrapper_VerInstallFileA
VerInstallFileW=Wrapper_VerInstallFileW
VerLanguageNameA=Wrapper_VerLanguageNameA
VerLanguageNameW=Wrapper_VerLanguageNameW
VerQueryValueA=Wrapper_VerQueryValueA
VerQueryValueW=Wrapper_VerQueryValueW

我使用不同的函数名称来防止包含Windows.h头文件时出现原型重定义错误。尝试构建以上代码会生成以下错误:

1>Main.obj : error LNK2001: unresolved external symbol _GetFileVersionInfoW@16
1>Main.obj : error LNK2001: unresolved external symbol _VerQueryValueA@16
1>Main.obj : error LNK2001: unresolved external symbol _GetFileVersionInfoSizeA@8
1>Main.obj : error LNK2001: unresolved external symbol _VerQueryValueW@16
1>Main.obj : error LNK2001: unresolved external symbol _GetFileVersionInfoSizeExW@12
1>Main.obj : error LNK2001: unresolved external symbol _VerInstallFileA@32
1>Main.obj : error LNK2001: unresolved external symbol _VerInstallFileW@32
1>Main.obj : error LNK2001: unresolved external symbol _GetFileVersionInfoA@16
1>Main.obj : error LNK2001: unresolved external symbol _GetFileVersionInfoExW@20
1>Main.obj : error LNK2001: unresolved external symbol _GetFileVersionInfoSizeW@8
1>Main.obj : error LNK2001: unresolved external symbol _VerFindFileW@32
1>Main.obj : error LNK2001: unresolved external symbol _GetFileVersionInfoSizeExA@12
1>Main.obj : error LNK2001: unresolved external symbol _GetFileVersionInfoExA@20

我承认这是我第一次尝试构建代理DLL,所以我可能会忽略一些显而易见的东西。谢谢。

2个回答

3
你需要在链接器属性页面的附加依赖项中添加version.lib
或者你可以在代码中添加以下内容:
#pragma comment(lib,"version")

3
链接器错误消息告诉您,您的DLL没有提供GetFileVersionInfoWVerQueryValueA等定义。这是代理DLL并不会改变这个事实。这是标准的、经典的链接器失败。您已经声明了一个函数,但没有为它提供定义。
最可能的情况是,您希望这些函数实现来自系统DLL Version.dll。在这种情况下,您需要向链接器提供适当的导入库version.lib以提供定义。
当您遇到这样的错误时,值得阅读文档。它说:

代码引用了链接器在库和对象文件中找不到的内容(例如函数、变量或标签)。

在我看来,这不能更清楚了。您已经引用了一个已被声明但未定义的内容。

啊,抱歉 - 我以为我已经添加了导入库,而认为错误与导出定义文件有关。没有想到要再检查一遍。 - shadeMe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接