首页 > 解决方案 > 如何排除故障:未定义的引用`non-virtual thunk to ...`

问题描述

我已经阅读了流动的问题和答案,但我没有解决我的问题。

如何排除故障:未定义对“非虚拟 thunk to ...”的引用

我在 Windows 上使用 mingw32 构建 code::blocks。我在链接步骤中收到错误,这是我的链接命令:

mingw32-g++.exe -Lbase/tinyxml -LC:/wxWidgets-3.1.1/lib/gcc_dll -Ldevel31 -Lexchndl/win32/lib -o devel31/codeblocks.exe .objs31/src/app.o .objs31/src/appglobals.o .objs31/src/associations.o .objs31/src/backtracedlg.o .objs31/src/breakpointsdlg.o .objs31/src/compilersettingsdlg.o .objs31/src/cpuregistersdlg.o .objs31/src/crashhandler.o .objs31/src/debugger_interface_creator.o .objs31/src/debuggermenu.o .objs31/src/debuggersettingscommonpanel.o .objs31/src/debuggersettingsdlg.o .objs31/src/debuggersettingspanel.o .objs31/src/disassemblydlg.o .objs31/src/dlgabout.o .objs31/src/dlgaboutplugin.o .objs31/src/editkeywordsdlg.o .objs31/src/editorconfigurationdlg.o .objs31/src/environmentsettingsdlg.o .objs31/src/examinememorydlg.o .objs31/src/find_replace.o .objs31/src/goto_file.o .objs31/src/infopane.o .objs31/src/main.o .objs31/src/notebookstyles.o .objs31/src/printdlg.o .objs31/src/projectdepsdlg.o .objs31/src/projectmanagerui.o .objs31/src/projectoptionsdlg.o .objs31/src/recentitemslist.o .objs31/src/scriptconsole.o .objs31/src/scriptingsettingsdlg.o .objs31/src/splashscreen.o .objs31/src/startherepage.o .objs31/src/switcherdlg.o .objs31/src/threadsdlg.o .objs31/src/virtualbuildtargetsdlg.o .objs31/src/watchesdlg.o  .objs31/src/resources/resources.res -Wl,--enable-auto-import -Wl,--no-undefined -m32  -lcodeblocks -lexchndl -lshfolder -lkernel32 -luser32 -lgdi32 -lcomdlg32 -lwinspool -lwinmm -lcomctl32 -lodbc32 -lole32 -loleaut32 -luuid -lrpcrt4 -ladvapi32 -lwsock32 -lwxmsw31u -mwindows

链接错误信息是:

.objs31/src/startherepage.o:startherepage.cpp:(.rdata$_ZTV9MyHtmlWin[__ZTV9MyHtmlWin]+0x414): undefined reference to `non-virtual thunk to wxHtmlWindow::SetHTMLWindowTitle(wxString const&)'
.objs31/src/startherepage.o:startherepage.cpp:(.rdata$_ZTV9MyHtmlWin[__ZTV9MyHtmlWin]+0x418): undefined reference to `non-virtual thunk to wxHtmlWindow::OnHTMLLinkClicked(wxHtmlLinkInfo const&)'
C:/Program Files (x86)/CodeBlocks/MinGW/bin/../lib/gcc/mingw32/5.1.0/../../../../mingw32/bin/ld.exe: .objs31/src/startherepage.o: bad reloc address 0x418 in section `.rdata$_ZTV9MyHtmlWin[__ZTV9MyHtmlWin]'
collect2.exe: error: ld returned 1 exit status

我检查了libwxmsw31u中的符号,没关系:

$ nm -po libwxmsw31u.a | c++filt | grep wxHtmlWindow::SetHTMLWindowTitle
libwxmsw31u.a:d021618.o:00000000 T non-virtual thunk to wxHtmlWindow::SetHTMLWindowTitle(wxString const&)
libwxmsw31u.a:d002747.o:00000000 T wxHtmlWindow::SetHTMLWindowTitle(wxString const&)

所以,我不知道我的链接过程发生了什么,以及如何解决这个问题?

标签: c++hyperlink

解决方案


我搜索了很多关于这个错误的信息,并从这篇文章(中文版)中得到了一些提示:

https://zhuanlan.zhihu.com/p/27121990

所以,我回顾了构建 Code::Blocks 的步骤,我发现我已经为另一个错误链接添加了一个标志。旗帜是:

_GLIBCXX_USE_CXX11_ABI=0

但是,当我构建 libwxmsw31u.a 时,我没有添加这个标志。

所以,我尝试删除 Code::Blocks 的这个标志,然后它的链接是正确的。

而且我有自己的 Code::Blocks!

但是,我仍然不知道为什么这个标志会导致这个链接错误。


推荐阅读