【问题标题】:Visual C++ linker complaining about the absence of a symbol that is not absentVisual C++ 链接器抱怨缺少不存在的符号
【发布时间】:2017-02-25 17:31:08
【问题描述】:

简而言之:在 Visual C++ 2015 上,我收到一个链接器错误,抱怨我链接的 .lib 文件中缺少符号。


长篇大论:在使用 cl.exe 从命令行编译和喜欢某些程序时,我得到以下错误中的第一个:

main.obj : error LNK2001: unresolved external symbol "protected: static struct wxEventTable const wxApp::sm_eventTable" (?sm_eventTable@wxApp@@1UwxEventTable@@B)

AFAIK,这条长线说我的 main.obj 引用了一个与符号 ?sm_eventTable@wxApp@@1UwxEventTable@@B 关联的函数,但是链接器在(长)列表中找不到这个符号我在命令行上提供的库。

我在 /MD 模式下编译。不知道它在这里是否有帮助、伤害或无关紧要。

我链接的文件之一是 wxmsw31u_core.lib 并且正在做

dumpbin /headers wxmsw31u_core.lib > here.txt

给出一个包含以下内容的长文件

  Version      : 0
  Machine      : 8664 (x64)
  TimeDateStamp: 56D46194 Mon Feb 29 16:19:48 2016
  SizeOfData   : 00000045
  DLL name     : wxmsw310u_core_vc140_x64.dll
  Symbol name  : ?sm_eventTable@wxApp@@1UwxEventTable@@B (protected: static struct wxEventTable const wxApp::sm_eventTable)
  Type         : data
  Name type    : name
  Hint         : 14083
  Name         : ?sm_eventTable@wxApp@@1UwxEventTable@@B

由此我推断 wxmsw31u_core.lib 这是一个“导入库”:换句话说,这意味着这个库不包含代码,而只是引用实际包含代码的 dll 文件 wxmsw310u_core_vc140_x64.dll。

正如我检查的那样,后一个 wxmsw310u_core_vc140_x64.dll 文件确实提到了 ?sm_eventTable@wxApp@@1UwxEventTable@@B:

dumpbin /EXPORTS wxmsw310u_core_vc140_x64.dll > here2.txt

给了

  14084 3703 0057F008 ?sm_eventTable@wxApp@@1UwxEventTable@@B = ?sm_eventTable@wxApp@@1UwxEventTable@@B (protected: static struct wxEventTable const wxApp::sm_eventTable)

我注意到第一个数字等于前一个标题的提示加一。我想这很正常吗?

我花时间检查了上面的 DLL,但是 AFAIK,链接过程中不需要 DLL(调用生成的 .exe 时需要它)。

总而言之,似乎一切都在那里并且应该链接,所以我无法确定这里出了什么问题。


编辑

我通过自己编译库而不是使用 wxWidgets 提供的 Windows 编译二进制文件部分解决了这个问题:我现在可以编译我的程序,一切都很好。

嗯,不是全部:最初的问题仍然存在。我有一种情况,我试图将 obj 与 lib 链接以获取 exe,obj 指的是 lib 中逐字存在的符号,链接器确实加载了 obj 和 lib(使用 /VERBOSE 确认),但是链接器拒绝将符号视为“已解析”。为什么?

我将创建一个新问题,询问有关要解决的条件的解释。

【问题讨论】:

    标签: visual-c++ linker-errors


    【解决方案1】:

    AFAIK,这条长线说我的 main.obj 指的是一个符号的函数?

    是的,链接器无法在您指定的路径上找到 sm_eventTable@wxApp@@1UwxEventTable@@B

    检查您是否已正确设置Additional Library Path 参数并且您的应用程序的目标平台是/Machine:X64

    【讨论】:

    • 感谢您的回答。我的命令行确实有 /MACHINE:X64 和 /LIBPATH:"the-path-to-the-lib" (无论如何没有 lib,链接器在前面的步骤中停止)。
    • @Arnaud /LIBPATH应该是目录的路径,而不是库文件本身
    • /LIBPATH:"%WXBASE%\lib\vc_x64_lib" 在我的批处理文件中更早的时候我有 SET "WXBASE=D:\wxWidgets" 和 D:\wxWidgets\lib\vc_x64_lib 是一个目录确实包含文件 wxmsw31u_core.lib 等等也许我应该把批处理文件的整个源代码放在这里(我有点害羞)
    • @Arnaud 您自己构建库吗?我问,因为我有 lib\vc140_x64_dll 包含所有库和 dll 的文件夹。尝试使用wxMSW-3.1.0_vc140_Dev.7z官方版本。 wxbase31u.lib 也应该在链接库中。
    • 这次我没有建库。也许这就是我应该做的,不过我想避免那种痛苦。
    猜你喜欢
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 2016-03-30
    • 2012-03-03
    • 2010-12-17
    • 2015-10-31
    • 2018-06-25
    • 1970-01-01
    相关资源
    最近更新 更多