代码之家  ›  专栏  ›  技术社区  ›  MathematicalOrchid

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

  •  0
  • MathematicalOrchid  · 技术社区  · 7 年前

    1. 我有一个VisualStudio 2012 C++项目,它使用WxWiWDIGET。它可以完美地编译和链接。
    2. 在修改了设置并获得了所有要编译的代码之后,它现在拒绝链接,因为它使用的所有库都是为VS 2012编译的。好吧。。。
    3. 除了 wxWidgets。

    我现在已经花了 多天 试图强迫wxWidgets工作是徒劳的。它就是做不到。

    以下是我迄今为止所做的工作:

    • 请参阅 https://github.com/wxWidgets/wxWidgets/releases/ ,看来我应该下载并解压缩两个文件:
      • wxWidgets-3.1.1-headers.7z include
      • wxMSW-3.1.1_vc140_Dev.7z (其中包含 lib 文件夹)。
    • 我删除了旧的wxWidgets,并打开了这两个新拉链。
    • 数百个预处理器错误,表示找不到某些包含文件。看起来旧的目录结构已经过时了 ...\lib\vc_lib\... ..\lib\vc140_dll\... ,因此我尝试重命名该文件夹。现在一切都编译成功了。
    • 接下来,链接器抱怨它找不到 wxbmsw28ud_core.lib *31 而不是 *28 ,并且没有其他找不到文件的错误。
    • 现在我有数百个LNK2001错误。例如:

    错误LNK2001未解析的外部符号“受保护:静态结构wxEventTable const wxDialogBase::sm_eventTable”(?sm_eventTable@wxDialogBase@@1wxeventtable@@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
    

    换句话说,,

    在里面 这个 .lib 那么,为什么VS抱怨它不在 lib先生 文件

    为了100%确定,我制作了一个表格,列出了VS声称找不到的每个符号,以及哪些符号 文件,它实际上在:

    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 或 wxbase31ud.lib ,它们都是在项目中配置的(还有几个附加的wxWidgets库)。

    我不明白问题出在哪里。我不明白为什么它在抱怨我。但我需要让它工作。有什么建议吗?

    4 回复  |  直到 7 年前
        1
  •  0
  •   Ripi2 user10587824    7 年前

    删除(或移动到其他目录)所有[old]wxWidgets内容,特别是在先前wxWidgets构建期间生成的目录和对象。

    official page ,或Windows安装程序。

    使用正确的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)文件, 您可能需要多次执行生成,因为项目 不总是按照正确的顺序构建,这可能会导致链接 错误。只需再次构建,最多3次,即可修复此问题。

    所以,只要打开 wx_vc14.sln 并构建您的解决方案。看来你想要 static

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

        2
  •  0
  •   VZ.    7 年前

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

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

    WXUSINDLL

        3
  •  0
  •   Igor    7 年前

    除了Vadim和Ripi2提供的巨大帮助之外,我认为您也在尝试将wxWidgets从2.8版升级到3.0版。这本身就是一个巨大的任务,你应该考虑做一个适当的然后另一个。

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

    非常感谢。

        4
  •  0
  •   MathematicalOrchid    7 年前

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

    尝试过,但最终我能够以这样一种方式编译wxWidgets,我的应用程序现在可以成功构建。似乎您必须检查VS中的所有成千上万的编译设置是否与目标应用程序相同。不,似乎不可能实现自动化。