添加cpr库后Qt6 WebAssembly构建失败:GLESv2/EGL依赖缺失
核心原因
cpr依赖的libcurl干扰Qt Wasm工具链配置
cpr底层依赖libcurl,部分libcurl的Conan包或CMake配置未适配WebAssembly环境,会强制触发系统原生库的查找逻辑,覆盖Qt for Wasm预设的虚拟GLESv2/EGL目标处理规则。Qt for Wasm本应使用Emscripten提供的虚拟图形API实现,而非真实系统库,但cpr引入的依赖打破了这一逻辑。工具链加载顺序冲突
若Conan工具链先于Qt的Wasm工具链加载,会重置CMake的find_package行为,导致Qt自带的Wasm专用配置(自动识别虚拟GLES/EGL)被忽略,转而尝试查找真实系统库。cpr的CMake配置未适配Wasm
cpr的默认CMake脚本未针对Emscripten环境做特殊处理,仍沿用原生平台的库查找逻辑,强行要求找到真实的GLESv2/EGL库文件。
具体解决方案
调整工具链加载顺序
在CMakeLists.txt开头优先加载Qt的Wasm工具链,再引入Conan配置:# 先加载Qt Wasm工具链 include($ENV{QT_INSTALL_DIR}/lib/cmake/Qt6/qt.toolchain.cmake) # 再加载Conan工具链 include(${CMAKE_BINARY_DIR}/conan_toolchain.cmake)强制Conan适配Wasm环境
在Conan配置文件(如conanfile.txt或conanfile.py)中明确指定目标平台为Emscripten,确保拉取适配Wasm的cpr及依赖包:# conanfile.txt示例 [settings] os=Emscripten os.version=3.1.67 # 匹配你的Emscripten版本 compiler=clang compiler.version=18 compiler.libcxx=libc++锁定CMake库查找范围
在CMakeLists.txt中添加以下配置,避免CMake去系统路径查找原生库,强制仅在Emscripten sysroot内查找:if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten") set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) endif()预先声明虚拟GLESv2/EGL目标
在find_package(Qt6)之前,手动声明虚拟目标并标记为已找到,覆盖Qt的查找逻辑:if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten") add_library(GLESv2 INTERFACE) add_library(EGL INTERFACE) target_link_libraries(GLESv2 INTERFACE emscripten::emscripten) target_link_libraries(EGL INTERFACE emscripten::emscripten) set(GLESv2_FOUND TRUE CACHE BOOL "" FORCE) set(EGL_FOUND TRUE CACHE BOOL "" FORCE) endif() # 之后再查找Qt组件 find_package(Qt6 REQUIRED COMPONENTS Gui Core Widgets)禁用cpr中不必要的依赖
若cpr的某个依赖(如部分curl变种)强行关联图形库,可通过CMake选项禁用:set(CPR_ENABLE_SSL OFF CACHE BOOL "" FORCE) set(CURL_CA_BUNDLE OFF CACHE BOOL "" FORCE)
内容的提问来源于stack exchange,提问作者Suslik

