更新了Visual Studio,现在wxWidgets抱怨未解析的符号

时间:2018-11-23 14:30:56

标签: c++ visual-studio linker wxwidgets

问题描述:

  1. 我有一个使用wxWidgets的Visual Studio 2012 C ++项目。它可以完美地编译和链接。
  2. 出于我们不愿讨论的原因,我现在需要使用Visual Studio 2015进行这项工作。
  3. 细化了设置并编译了所有代码,现在它拒绝链接,因为它使用的所有库都是针对VS 2012编译的。
  4. 我用为VS 2015编译的库替换了所有库。一切再次正常工作... 除了 wxWidgets。

我现在已经花了几天徒劳无功,试图迫使wxWidgets正常工作。只是不会做。

这是我到目前为止所做的:

  • 按照https://github.com/wxWidgets/wxWidgets/releases/上的说明进行操作,看来我应该下载并解压缩两个文件:
    • wxWidgets-3.1.1-headers.7z(包含一个include文件夹)
    • wxMSW-3.1.1_vc140_Dev.7z(包含一个lib文件夹)。
  • 我删除了旧的wxWidgets东西,然后解压缩了这两个新的zip。
  • 数百个预处理器错误,表明找不到某些包含文件。看起来旧目录结构具有...\lib\vc_lib\...而不是..\lib\vc140_dll\...,因此我尝试重命名该文件夹。现在一切都可以成功编译了。
  • 接下来,链接器抱怨找不到wxbmsw28ud_core.lib,这是有道理的,考虑到我刚刚删除了它。我将所有文件名都更改为*31而不是*28,并且不再出现文件未找到的错误。
  • 现在我有数百个LNK2001错误。例如:
  

错误LNK2001无法解析的外部符号“受保护:静态结构wxEventTable常量wxDialogBase :: sm_eventTable”(?sm_eventTable @ wxDialogBase @@ 1UwxEventTable @@ B)

我不明白这一点。如果我对DumpBin.exe运行wxmsw31ud_core.lib,它将转储几兆字节的文本,包括:

5146A2 __imp_?sm_eventTable@wxDialogBase@@1UwxEventTable@@B

还有

29C0 __imp_?sm_eventTable@wxDialogBase@@1UwxEventTable@@B

还有

Version      : 0
Machine      : 14C (x86)
TimeDateStamp: 5A8A0543 Sun Feb 18 22:59:15 2018
SizeOfData   : 00000049
DLL name     : wxmsw311ud_core_vc140.dll
Symbol name  : ?sm_eventTable@wxDialogBase@@1UwxEventTable@@B (protected: static struct wxEventTable const wxDialogBase::sm_eventTable)
Type         : data
Name type    : name
Hint         : 14306
Name         : ?sm_eventTable@wxDialogBase@@1UwxEventTable@@B

换句话说, VS说找不到的确切符号!

因此,如果符号位于.lib文件中的 中,并且可以在那里看到 ,为什么VS抱怨它不在{{1}中}文件?

可以肯定地说,我制作了一张表格,列出了VS声称找不到的每个符号以及它实际上在哪个.lib文件中:

.lib

如您所见,每个LNK2001 ?sm_eventTable@wxDialogBase@@1UwxEventTable@@B wxmsw31ud_core.lib LNK2001 ?wxTheAssertHandler@@3P6AXABVwxString@@H000@ZA wxbase31ud.lib LNK2001 ?wxTrapInAssert@@3_NA wxbase31ud.lib LNK2001 ?wxConvLibcPtr@@3PAVwxMBConv@@A wxbase31ud.lib LNK2001 ?wxEmptyString@@3PB_WB wxbase31ud.lib LNK2001 ?npos@wxString@@2IB wxbase31ud.lib LNK2001 ?sm_first@wxClassInfo@@0PAV1@A wxbase31ud.lib LNK2001 ?wxNullBitmap@@3VwxBitmap@@A wxmsw31ud_core.lib LNK2001 ?wxNullIcon@@3VwxIcon@@A wxmsw31ud_core.lib LNK2001 ?wxDefaultSize@@3VwxSize@@B wxmsw31ud_core.lib LNK2001 ?wxDefaultPosition@@3VwxPoint@@B wxmsw31ud_core.lib LNK2001 ?wxEVT_NULL@@3HB wxbase31ud.lib LNK2001 ?wxEVT_BUTTON@@3V?$wxEventTypeTag@VwxCommandEvent@@@@B wxmsw31ud_core.lib LNK2001 ?wxDefaultValidator@@3VwxValidator@@B wxmsw31ud_core.lib LNK2001 ?wxButtonNameStr@@3QBDB wxmsw31ud_core.lib LNK2001 ?ms_classInfo@wxDialog@@2VwxClassInfo@@A wxmsw31ud_core.lib LNK2001 ?wxStaticTextNameStr@@3QBDB wxmsw31ud_core.lib LNK2001 ?wxListCtrlNameStr@@3QBDB wxmsw31ud_core.lib LNK2001 ?wxConvUTF8Ptr@@3PAVwxMBConvStrictUTF8@@A wxbase31ud.lib LNK2001 ?ms_appInitFn@wxAppConsoleBase@@1P6APAVwxAppConsole@@XZA wxbase31ud.lib LNK2001 ?ms_appInstance@wxAppConsoleBase@@1PAVwxAppConsole@@A wxbase31ud.lib LNK2001 ?ms_idMainThread@wxThread@@0KA wxbase31ud.lib LNK2001 ?wxEVT_CLOSE_WINDOW@@3V?$wxEventTypeTag@VwxCloseEvent@@@@B wxmsw31ud_core.lib LNK2001 ?wxEVT_SIZING@@3V?$wxEventTypeTag@VwxSizeEvent@@@@B wxmsw31ud_core.lib LNK2001 ?wxEVT_COMMAND_ENTER@@3V?$wxEventTypeTag@VwxCommandEvent@@@@B wxmsw31ud_core.lib LNK2001 ?wxTextCtrlNameStr@@3QBDB wxmsw31ud_core.lib LNK2001 ?wxGaugeNameStr@@3QBDB wxmsw31ud_core.lib LNK1120 28 unresolved externals wxmsw31ud_core.lib中都列出了每个符号,它们都在项目中进行了配置(以及其他几个wxWidgets库)。

我不明白问题是什么。我不明白为什么它在抱怨我。但是我需要做好这项工作。有什么建议吗?

4 个答案:

答案 0 :(得分:0)

混合来自不同VS版本的编译文件将在链接阶段导致错误(“未找到”或“不兼容”)。另外,混合使用32/64版本将失败。

删除(或移至其他)wxWidgets的所有内容,特别是在上一个wxWidgets构建期间生成的目录和对象。

official page或Windows安装程序中下载当前的wxWidgets源。

使用正确的VS解决方案进行构建。取自wxdir\docs\msw\install.txt

  

已为VC ++版本7、8、9、10提供了易于使用的项目文件,   11、12、14和15(也称为MSVS 2003、2005、2008、2010、2012,   2013、2015和2017)。

     

只需打开wx_vcN.sln(对于N = 7、8、9、10、11、12、14或15)文件,   选择适当的配置(调试或发布,静态或DLL)   并建立解决方案。请注意,构建DLL配置时,   您可能需要执行几次构建,​​因为项目   并非总是以正确的顺序构建的,这可能会导致链接   错误。只需重新构建一次,最多3次,即可解决此问题。

因此,只需打开wx_vc14.sln并构建您的解决方案。似乎您需要static库,因此wx会嵌入到您的应用中;如果没有,请选择DLL解决方案。

请注意,在该wxWidgets下载页面中,您可以直接获取标头以及已经编译的静态(“开发”)或动态(“ Release DLL”)文件,从而避免wxWidgets本身进行编译。

答案 1 :(得分:0)

您的链接错误是由于与DLL导入库链接时,链接器在静态库中寻找该功能。写下时的IOW

  

换句话说,VS说的找不到的确切符号!

这是错误的,因为存在明显的区别:一个符号带有__imp__前缀,而另一个则没有。

要么使用定义的WXUSINDLL来重建应用程序,要么使用静态wx库进行链接。

老实说,我们所有人都会犯错,您可能花了数小时甚至数天时间来解决可以在几分钟内解决的问题,但是当问题出在工具上时,责怪您的工具确实无济于事。< / p>

答案 2 :(得分:0)

在Vadim和Ripi2的大力帮助下,我认为您还试图将wxWidgets从2.8版升级到3.0版。这本身就是一项艰巨的任务,您应该考虑正确地做一个然后再做另一个。

我将从手头的编译器开始静态地构建2.8源,然后尝试非常仔细地对wxWidgets的版本进行升级。

谢谢。

答案 3 :(得分:0)

我最终放弃了,并尝试从源代码构建wxWidgets。

进行了很多次多次尝试,但是最终我能够以一种方式编译wxWidgets,从而使我的应用程序现在可以成功构建。看来您必须检查VS中成千上万的编译设置是否与目标应用程序相同。不,它似乎不可能实现自动化。

(说了这么多,与通常从源代码构建任何与C相关的东西相比,这简直是噩梦般的,这相对容易...)

相关问题