使用 gcc / mingw 时,我应该如何链接到静态 wxWidgets 库?

Rei*_*ica 1 wxwidgets mingw static-linking

这相当令人沮丧,最常见的答案是“做 CodeBlocks 所做的事情”。我不在乎。我想明白。

问题是:wxWidgets 在非整体构建时被拆分到多个静态库中。这些必须根据它们的依赖关系以正确的顺序链接,否则静态链接将失败。

这些库是(它们的文件名是缩写的,但为了简单起见,我使用了它们的全名):

wxAdvanced
wxAui
wxBase
wxCore
wxGL
wxHTML
wxMedia
wxNet
wxPropertyGrid
wxQA
wxRibbon
wxRichText
wxSTC
wxWebView
wxXML
wxXRC
Run Code Online (Sandbox Code Playgroud)

什么是魔术顺序,我们可以在哪里查找 - 最重要的是:它如何归入我的项目CMakeLists.txt

下面显示了一些具有代表性的错误消息 - 也许它们会使通过网络搜索更容易发现此问答:

C:/wxwidgets-install_3.1.3_9/lib/gcc_x64_lib/wxmsw31ud_aui.a(floatpane.cpp.obj):floatpane.cpp:(.rdata$.refptr._ZN11wxMiniFrame12ms_classInfoE[.refptr._ZN11wxMiniFrame12ms_classInfoE]+0x0): undefined reference to `wxMiniFrame::ms_classInfo'

C:/wxwidgets-install_3.1.3_9/lib/gcc_x64_lib/wxmsw31ud_core.a(window.cpp.obj):window.cpp:(.rdata$.refptr.wxEVT_POWER_RESUME[.refptr.wxEVT_POWER_RESUME]+0x0): undefined reference to `wxEVT_POWER_RESUME'

src/CMakeFiles/wxmaxima.dir/Unity/unity_10.cxx.obj: In function `XmlInspector::XmlInspector(wxWindow*, int)':
C:/projects/wxMaxima/src/XmlInspector.cpp:42: undefined reference to `wxRichTextCtrl::wxRichTextCtrl(wxWindow*, int, wxString const&, wxPoint const&, wxSize const&, long, wxValidator const&, wxString const&)'
Run Code Online (Sandbox Code Playgroud)

Rei*_*ica 5

简而言之,这个想法是:遵循下面的依赖关系图,并确保指向的库(依赖项)它们的依赖项(指向的库)之后。好的,你说之后,但是这个“之后”究竟适用于哪里?它适用于:

  1. 带有诸如-lwxbase31ud -lwxbase31ud_net等条目的链接器/编译器命令行。

  2. CMakeLists.txt找到 wxWidgets的行,比如find_package(wxWidgets ... base net ...)

在后一种情况下,人们当然会问为什么为什么 CMake 的FindwxWidgets.cmake模块没有正确地对库进行排序,例如,我不知道,任何其他健全的 CMake 框架支持模块(Qt,例如)?好吧,它已经半途而废了,这只是其中的一个方面。作为用户,您在使用 CMake 时永远不必知道这些依赖项,实际上这不是一件正常的事情,因为大多数其他主要的 CMake 模块都会处理它(他们应该这样做!)。

因此,在下面的答案中,与 CMake 相关的任何事情都应该被视为对损坏的支持模块的解决方法。但是,由于即使您非常熟悉所涉及的工具,这些事情也可能需要很长时间才能弄清楚,因此期望没有很多经验和/或顽固决心的人只知道这一点是荒谬的。我希望这个答案可以为某人省去一些悲伤:)

wxWidgets 3.x 的依赖关系图

wxWidgets 库依赖树

当您自己处理 makefile 时,您必须保持这种顺序作为传递给将 exectable 放在一起的链接器的参数。

使用cmake时,链接顺序遵循find_package顺序。

例子

假设我们有

find_package(wxWidgets 3 REQUIRED core base adv xml html aui net richtext)
Run Code Online (Sandbox Code Playgroud)

让我们检查一下:core在之前base- 好的,因为在图表上core指向base

但随后有大量错误adv必须在之前corexmlbasehtmlcoreauiadvnetbase,和richtext之前advhtmlxml

我们进行了一些拓扑排序并得出:

find_package(wxWidgets 3 REQUIRED richtext aui adv html core xml net base)
Run Code Online (Sandbox Code Playgroud)

事实上:这允许项目链接。好极了!

wxWidgets 2.5-2.8 的 DependencyGraph

在此处输入图片说明