由于缺少 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,但这仍然会导致:
- 找不到 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。
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
.
显然,任何与 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。
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
.