由于缺少 wxxml.lib,wxWidgets 无法构建

wxWidgets fails to build due to missing wxxml.lib

显然,任何与 GUI 相关的组件都涉及 XML。因此,我无法从源代码实际配置和构建 wxWidgets。我是 wxWidgets 新手。

我当前的设置是在 Win10 上使用 MSVC v141 (Visual Studio 2017) 和最新的 CMake 版本(当前为 3.21)。

在 wxWidgets 项目的 config.cmake 中(使用最新的 master 分支)我看到了

wx_get_dependencies(EXTRALIBS_XML xml)

我也用 -DwxUSE_XML=ON(以及其他参数)调用 CMake,但这仍然会导致:

然后链接失败并出现以下错误:

LINK : fatal error LNK1104: cannot open file 'wxxml.lib' [C:\Users\...\CMakeBuilds\ef5b5ada-ee42-7735-988a-ae37c735ccff\build\deps\build\wxwidgets\libs\qa\wxqa.vcxproj]

wxWidgets 实际上使用的是什么库?我如何触发它的检索以及相应的配置和构建?由于我将 wxWidgets 作为 ExternalProject 组件添加到我的 CMake 项目中,因此我会很欣赏这种思路。然而,关于此问题的任何类型的信息都非常受欢迎,特别是因为它将阐明如何配置其他功能(如果我将来需要它们),例如 WebView。

wxxml.lib 问题现已解决。在修复它的同时,我还在 wxWidgets 的构建系统中发现了一个(某种)错误。

特别是构建这个库失败的原因其实很简单,就是对wxWidgets的依赖关系缺乏了解。我认为 wxWidgets,鉴于它非常依赖 XML,有它自己的 XML 解析器。好吧,不是真的。 wxXML 组件实际上使用了名为 EXPAT 的底层第 3 方依赖项,正如您在我的问题中看到的那样,我已停用,因为它在构建过程中给我带来了问题(由于仍然存在无法自动检索依赖项的问题)。

我所做的是克隆 libexpat repository,将其添加为 ExternalProject,为库和包含目录设置变量,并将它们传递到我的 wxWidgets 项目中。但是有一个问题...

expat.cmake 文件如下所示:

#############################################################################
# Name:        build/cmake/lib/expat.cmake
# Purpose:     Use external or internal expat lib
# Author:      Tobias Taschner
# Created:     2016-09-21
# Copyright:   (c) 2016 wxWidgets development team
# Licence:     wxWindows licence
#############################################################################

if(wxUSE_EXPAT STREQUAL "builtin")
    # TODO: implement building expat via its CMake file, using
    # add_subdirectory or ExternalProject_Add
    wx_add_builtin_library(wxexpat
        src/expat/expat/lib/xmlparse.c
        src/expat/expat/lib/xmlrole.c
        src/expat/expat/lib/xmltok.c
    )
    set(EXPAT_LIBRARIES wxexpat)
    set(EXPAT_INCLUDE_DIRS ${wxSOURCE_DIR}/src/expat/expat/lib)
elseif(wxUSE_EXPAT)
    find_package(EXPAT REQUIRED)
endif()

如果选择 builtin 作为相应库的值,我将使用存储在 <ROOT_OF_WXWIDGETS_PROJECT>/build/cmake/lib 中的第三方依赖项的 *.cmake 文件来确定我需要设置哪些变量.因为我想使用我自己的,所以我需要 sys(例如 -DwxUSE_EXPAT=sys 作为我的 wxWidgets ExternalProject 中的 CMAKE_ARGS)并相应地传递 headers 和库.

鉴于上面的文件,我们会假设 EXPAT_LIBRARIES 是必需的。然而,在构建失败(又一次)并看到原因是激活的 expat 构建并且它被设置为 builtin 之后,我详细检查了日志并发现了以下错误:

Could NOT find EXPAT (missing: EXPAT_LIBRARY) (found version "2.2.6")

注意 EXPAT_LIBRARY。通过它 (-DEXPAT_LIBRARY=...) 之后我的构建就完成了。对我来说,这是一个错误,或者只是依赖性 cmake 文件与 wxWidgets 项目的其余部分之间的不一致。

重要的是要注意我没有通过 wxWidgets 本身检索外部依赖(参见 config.cmake 更准确地说是宏 wx_get_dependencies(...))。这解决了 wxWidgets 的基本配置和构建的问题,但是如果你不想自己解决 wxWidgets 的每个依赖项(你为什么要这样做?),我建议寻找一个解决方案,其中依赖项(至少是你的依赖项)不想处理)被自动检索、配置和构建为 builtin.