我如何使用 CMake 和 FindLibXml2 来 link 针对不需要 DLL 的静态版本的 LibXml2

How can I use CMake and FindLibXml2 to link against a static version of LibXml2 that requires no DLL

我正在使我们的 CMake 构建系统现代化并切换到所有依赖项的静态编译,以便我可以将应用程序部署为单个二进制文件。依赖项之一是静态编译的 LibXml2(环境 MSVC 2019 x64 Native):

cscript configure.js iconv=no compiler=msvc cruntime=/MT debug=yes static=yes prefix=libxml
nmake Makefile.msvc libxml install

这会生成 DLL win32\libxml\bin\libxml2.dll 和 LIB 文件 win32\libxml\lib\libxml2.libwin32\libxml\lib\libxml2_a.lib

我的 CMake 文件如下所示:

find_package(LibXml2 REQUIRED)

add_executable(testapp WIN32)

target_sources(testapp
    PRIVATE
        Main.cpp
)

target_include_directories(testapp PUBLIC ${LIBXML_LIBRARIES})

target_link_libraries(testapp PRIVATE LibXml2::LibXml2)

问题:看起来查找模块FindLibXml2 找到了可重定位的共享DLL,但没有找到静态LIB 存档。因此,应用程序是针对动态库link编辑的。

问题:我如何使用查找模块脚本,但link针对静态版本的LibXml2?这甚至可能还是我必须编写自己的查找脚本?

用户@alex-reinking 给出了重要提示:在调用查找模块之前设置缓存变量 - 而不是之后。

因为我不想对路径进行硬编码(而且不能因为我有 LibXml2 的调试和发布版本),所以我使用 find_library 来查找静态库(注意:我添加了libxml 目录通过 CMAKE_PREFIX_PATH):

find_library(STATIC_LIBXML2_LIBRARY NAMES libxml2_a)
message(STATUS "Found library: ${STATIC_LIBXML2_LIBRARY}")
set(LIBXML2_LIBRARY ${STATIC_LIBXML2_LIBRARY})
find_package(LibXml2 REQUIRED)