【问题标题】:How should I link to static wxWidgets libraries when using gcc / mingw?使用 gcc / mingw 时我应该如何链接到静态 wxWidgets 库?
【发布时间】:2020-10-17 18:29:08
【问题描述】:

这很令人沮丧,最常见的答案是“做 CodeBlocks 所做的事情”。我不在乎。我想了解。

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

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

wxAdvanced
wxAui
wxBase
wxCore
wxGL
wxHTML
wxMedia
wxNet
wxPropertyGrid
wxQA
wxRibbon
wxRichText
wxSTC
wxWebView
wxXML
wxXRC

什么是魔术顺序,我们可以在哪里查找它 - 最重要的是:它是如何计入我项目的 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&)'

【问题讨论】:

    标签: mingw wxwidgets static-linking


    【解决方案1】:

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

    1. 链接器/编译器命令行,包含 -lwxbase31ud -lwxbase31ud_net 等条目。

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

    在后一种情况下,人们当然可以问为什么 CMake 的 FindwxWidgets.cmake 模块不能正确排序库,就像我不知道任何其他理智的 CMake 框架支持模块一样(Qt,对于一个)?嗯,它是半坏的,这只是它的一个方面。作为用户,在使用 CMake 时,您永远不必知道这些依赖关系,实际上这不是一件正常的事情,因为大多数其他主要 CMake 模块都会处理它(因为它们应该!)。

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

    wxWidgets 3.x 的依赖关系图

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

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

    示例

    假设我们有

    find_package(wxWidgets 3 REQUIRED core base adv xml html aui net richtext)
    

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

    但是有错误很多adv 必须在core 之前。 xmlbase 之前,htmlcore 之前,auiadv 之前,netbase 之前,和richtextxml 之前和xml 之前。 /p>

    我们做了一点拓扑排序,得出:

    find_package(wxWidgets 3 REQUIRED richtext aui adv html core xml net base)
    

    确实:这允许项目链接。耶!

    wxWidgets 2.5-2.8 的依赖关系图

    【讨论】:

    • 这是正确答案,但我想补充一点,此信息存在于 manual 中。
    • @VZ 哦,我知道,这就是漂亮图片的来源,如果您单击它,它会将您发送到手册 :) 但是您看,否则手册页是无用的.因为是的,它显示了一个很酷的图形很酷,但它并没有解释如何处理这些信息。如果您搜索遇到此类问题的人的帖子,很明显,手册页的营销部门的 SEO 工作做得很糟糕,因为 1) 没有人认为它可以解决他们的问题,并且 2) 它没有告诉您要做什么做(如:像这样重新排序,在 CMakeLists.txt 的这一行中)。
    • @VZ 一般来说,cmake的手册是缺乏技术沟通技巧的永久记录。这绝对是可怕的。它几乎没有为任何事情提供任何理由,它只是提供事实,并且您可以利用这些事实。并且关于这个主题的各种书籍并没有改善任何东西(以免有人告诉我典型的借口“你需要读一本关于它的书”)。我出版了每一本关于 cmake 的书,它们堆在地下室的一摞里,其中 50% 的内容是对读者智力的侮辱。他们不回答任何棘手的问题。
    • 抱歉,我没有注意到图片是链接。至于其余的,构建 wxWidgets 应用程序的方法有很多很多。最近 CMake 似乎真的将自己确立为事实上的标准(不幸的是),但仍然有很多人使用 MSVS 解决方案、Xcode 项目或只是手动生成文件。我们不能真正记录所有可能的用例,所以我们只给出可以推断出正确库顺序的依赖关系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 2017-04-29
    • 1970-01-01
    相关资源
    最近更新 更多