问题描述:
我现在已经花了几天徒劳无功,试图迫使wxWidgets正常工作。只是不会做。
这是我到目前为止所做的:
wxWidgets-3.1.1-headers.7z
(包含一个include
文件夹)wxMSW-3.1.1_vc140_Dev.7z
(包含一个lib
文件夹)。...\lib\vc_lib\...
而不是..\lib\vc140_dll\...
,因此我尝试重命名该文件夹。现在一切都可以成功编译了。wxbmsw28ud_core.lib
,这是有道理的,考虑到我刚刚删除了它。我将所有文件名都更改为*31
而不是*28
,并且不再出现文件未找到的错误。错误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库)。
我不明白问题是什么。我不明白为什么它在抱怨我。但是我需要做好这项工作。有什么建议吗?
答案 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相关的东西相比,这简直是噩梦般的,这相对容易...)