【问题标题】:wxWidgets fails to build due to missing wxxml.lib由于缺少 wxxml.lib,wxWidgets 无法构建
【发布时间】:2021-11-11 15:33:27
【问题描述】:

显然任何与 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,但这仍然会导致:

  • 找不到 XML 依赖项
  • 分别没有构建

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

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。

【问题讨论】:

  • 您正在尝试构建什么操作系统和 wx 版本?什么编译器?您是否在尝试构建库或应用程序时遇到此错误?
  • @Igor,对不起,忘了说。这是漫长的一天。
  • 而你没有回答我的最后一个问题...
  • @Igor "从源代码配置和构建 wxWidgets" - 除非我们在谈论演示和示例,否则我会说很明显我在谈论库本身。 :)
  • @rbaleksandr,你克隆了 wxWidgets 存储库吗?如果是这样 - 您是使用文档中的命令还是仅使用 git clone...

标签: visual-c++ cmake wxwidgets


【解决方案1】:

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

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

我所做的是克隆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)并相应地传递标头和库。

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

找不到 EXPAT(缺少:EXPAT_LIBRARY)(找到版本“2.2.6”)

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-02
    • 2013-07-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    相关资源
    最近更新 更多