【发布时间】: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 确认),但是链接器拒绝将符号视为“已解析”。为什么?
我将创建一个新问题,询问有关要解决的条件的解释。
【问题讨论】: