如何通过CMake链接vcpkg安装的LibXml2库?
问题:VCPKG安装LibXml2后CMake标准方式引入失败
我用vcpkg安装了LibXml2,直接将全路径写入include_directories等指令中可正常运行,但这种方式不规范。尝试用CMake标准方式引入该库时出现错误,参考过同类问题的解决方案仍未解决。
我的CMakeLists.txt代码如下:
SET(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake") project(ESMTOOLKIT) cmake_minimum_required(VERSION 3.15.5) set(CMAKE_CXX_STANDARD 17) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ../bin) find_package(LibXml2 REQUIRED) #include_directories(C:/Users/user/source/vcpkg/vcpkg/installed/x64-windows/include include) include_directories(${LIBXML2_INCLUDE_DIRS} include) #link_directories(C:/Users/user/source/vcpkg/vcpkg/installed/x64-windows/lib) set(SOURCES xmlUtils.cpp include/xmlUtils.h pch.cpp include/pch.h esmReader.cpp) add_executable(esmToolkit ${SOURCES}) #target_link_libraries(esmToolkit libxml2.lib) target_link_libraries(esmToolkit PRIVATE ${LIBXML2_LIBRARIES}) add_subdirectory(subrecords) add_subdirectory(records)
出现的错误信息:
Selecting Windows SDK version 10.0.19041.0 to target Windows 10.0.19044. CMake Error at C:/Program Files/CMake/3_24/share/cmake-3.24/Modules/FindPackageHandleStandardArgs.cmake:230 (message): Could NOT find LibXml2 (missing: LIBXML2_LIBRARY LIBXML2_INCLUDE_DIR) Call Stack (most recent call first): C:/Program Files/CMake/3_24/share/cmake-3.24/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE) C:/Program Files/CMake/3_24/share/cmake-3.24/Modules/FindLibXml2.cmake:108 (FIND_PACKAGE_HANDLE_STANDARD_ARGS) CMakeLists.txt:9 (find_package) Configuring incomplete, errors occurred! See also "C:/Users/user/source/repos/esmToolkit/build/CMakeFiles/CMakeOutput.log".
已配置的环境变量:
VCPKG_DEFAULT_TRIPLET x64-windows VCPKG_ROOT C:\Users\user\source\vcpkg\vcpkg
排查与解决方案
调整工具链文件位置
CMake要求工具链文件必须在项目初始化前设置,把SET(CMAKE_TOOLCHAIN_FILE)移到cmake_minimum_required之后、project之前:cmake_minimum_required(VERSION 3.15.5) SET(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake") project(ESMTOOLKIT)确认LibXml2安装状态
打开终端执行vcpkg list,检查是否存在libxml2:x64-windows条目。如果没有,重新执行安装命令:vcpkg install libxml2:x64-windows规范路径关联方式
使用vcpkg工具链后,无需手动调用include_directories或link_directories,find_package会自动处理依赖路径。建议将全局include替换为目标关联的方式:# 移除原有的include_directories行 target_include_directories(esmToolkit PRIVATE include ${LIBXML2_INCLUDE_DIRS})验证环境变量生效
重启终端或IDE,确保环境变量被正确读取。可以在终端执行echo %VCPKG_ROOT%和echo %VCPKG_DEFAULT_TRIPLET%,确认路径和三元组与配置一致。清理CMake缓存
删除build目录下的所有文件,重新运行CMake配置,避免旧缓存干扰依赖查找。
内容的提问来源于stack exchange,提问作者Dmitrii Motorygin
相关产品推荐
相关产品推荐

