【问题标题】:How can I use CMake and FindLibXml2 to link against a static version of LibXml2 that requires no DLL如何使用 CMake 和 FindLibXml2 链接不需要 DLL 的静态版本的 LibXml2
【发布时间】:2021-10-04 14:09:27
【问题描述】:

我正在现代化我们的 CMake 构建系统并切换到所有依赖项的静态编译,以便我可以将应用程序部署为单个二进制文件。其中一个依赖项是静态编译的 LibXml2(Environment 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 存档。因此,应用程序与动态库链接。

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

【问题讨论】:

  • 尝试在命令行中将LIBXML2_LIBRARY 设置为X:/path/to/win32/libxml/lib/libxml2_a.lib

标签: c++ cmake static-libraries static-linking libxml2


【解决方案1】:

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

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

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)

【讨论】:

    猜你喜欢
    • 2011-03-11
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 2022-07-15
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 2010-09-30
    相关资源
    最近更新 更多