Windows下使用VCPKG时CMake无法找到EGL组件
问题:Windows下VCPKG安装EGL后CMake无法识别
将Linux下正常运行的项目移植到Windows,使用VCPKG管理第三方库,freetype、openssh等多数库均可被CMake正确识别,但OpenGL相关配置失败——CMake能找到OpenGL,却找不到已通过VCPKG安装的EGL库。
VCPKG安装目录文件列表
库文件(installed/x64-windows/lib/)
ANGLE.lib brotlicommon.lib cairo.lib freetype.lib jpeg.lib libcurl.lib libpgport.lib libssl.lib libxml2.lib mbedtls.lib pkgconfig/ sqlite3.lib utf8proc.lib GlU32.Lib brotlidec.lib charset.lib getopt.lib leptonica-1.83.1.lib libecpg.lib libpgtypes.lib libwebp.lib lz4.lib mbedx509.lib pthreadVC3.lib ssh.lib zlib.lib OpenGL32.Lib brotlienc.lib dl.lib gif.lib libEGL.lib libecpg_compat.lib libpng16.lib libwebpdecoder.lib lzma.lib openjp2.lib pthreadVCE3.lib tesseract53.lib zstd.lib ZXing.lib bz2.lib fmt.lib iconv.lib libGLESv2.lib libexpat.lib libpq.lib libwebpdemux.lib lzo2.lib pixman-1.lib pthreadVSE3.lib tiff.lib archive.lib cairo-script-interpreter.lib fontconfig.lib intl.lib libcrypto.lib libpgcommon.lib libsharpyuv.lib libwebpmux.lib mbedcrypto.lib pkgconf.lib spdlog.lib turbojpeg.lib
头文件(installed/x64-windows/include/)
EGL/ ZXing/ dirent.h expat_config.h glm/ jpeglib.h libssh/ lz4hc.h opj_stdint.h pgtypes_interval.h postgres_ext.h sqlca.h tiff.h zdict.h GL/ _ptw32.h dlfcn.h expat_external.h headers/ leptonica/ libxml/ lzma/ pg_config.h pgtypes_numeric.h psa/ sqlda-compat.h tiffconf.h zlib.h GLES/ archive.h ecpg_config.h fmt/ iconv.h libcharset.h libxml2/ lzma.h pg_config_ext.h pgtypes_timestamp.h pthread.h sqlda-native.h tiffio.h zstd.h GLES2/ archive_entry.h ecpg_informix.h fontconfig/ informix/ libintl.h localcharset.h lzo/ pg_config_manual.h pixman-1/ sched.h sqlda.h tiffvers.h zstd_errors.h GLES3/ brotli/ ecpgerrno.h freetype/ internal/ libpng16/ lz4.h mbedtls/ pg_config_os.h pkgconf/ semaphore.h sqlite3-vcpkg-config.h turbojpeg.h GLSC/ bzlib.h ecpglib.h ft2build.h jconfig.h libpq/ lz4file.h openjpeg.h pgtypes.h png.h server/ sqlite3.h utf8proc.h GLSC2/ cairo/ ecpgtype.h getopt.h jerror.h libpq-events.h lz4frame.h openssl/ pgtypes_date.h pngconf.h spdlog/ sqlite3ext.h webp/ KHR/ curl/ expat.h gif_lib.h jmorecfg.h libpq-fe.h lz4frame_static.h opj_config.h pgtypes_error.h pnglibconf.h sql3types.h tesseract/ zconf.h
简化后的CMakeLists.txt
cmake_minimum_required(VERSION 3.8) find_package(OpenGL REQUIRED COMPONENTS OpenGL EGL) include_directories(OpenGL::EGL OpenGL::GL) set (GL_HEADERS quegl.h ) set (GL_SOURCES quegl.cpp ) add_library (quillkhronos SHARED ${GL_HEADERS} ${GL_SOURCES} ) target_link_libraries (quillkhronos LINK_PUBLIC quill OpenGL::EGL OpenGL::GL )
CMake配置输出
Running C:\Qt\Tools\CMake_64\bin\cmake.exe -S C:/projects/quill -B C:/projects/build-quill-Desktop_Qt_5_15_2_MSVC2019_64bit-Debug "-DENABLE_OPENGL:BOOL=ON" in C:\projects\build-quill-Desktop_Qt_5_15_2_MSVC2019_64bit-Debug. -- VCPKG-Info: CMAKE_MAP_IMPORTED_CONFIG_MINSIZEREL set to MinSizeRel;Release; -- VCPKG-Info: CMAKE_MAP_IMPORTED_CONFIG_RELWITHDEBINFO set to RelWithDebInfo;Release; CMake Error at C:/Qt/Tools/CMake_64/share/cmake-3.23/Modules/FindPackageHandleStandardArgs.cmake:230 (message): Could NOT find OpenGL (missing: EGL) Call Stack (most recent call first): C:/Qt/Tools/CMake_64/share/cmake-3.23/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE) C:/Qt/Tools/CMake_64/share/cmake-3.23/Modules/FindOpenGL.cmake:443 (FIND_PACKAGE_HANDLE_STANDARD_ARGS) C:/projects/vcpkg/scripts/buildsystems/vcpkg.cmake:853 (_find_package) quillkhronos/CMakeLists.txt:4 (find_package) -- Configuring incomplete, errors occurred! See also "C:/projects/build-quill-Desktop_Qt_5_15_2_MSVC2019_64bit-Debug/CMakeFiles/CMakeOutput.log". See also "C:/projects/build-quill-Desktop_Qt_5_15_2_MSVC2019_64bit-Debug/CMakeFiles/CMakeError.log". CMake process exited with exit code 1. Elapsed time: 00:00.
解决方案
原因分析
Windows原生OpenGL库不包含EGL,VCPKG安装的EGL来自ANGLE组件,而CMake内置的FindOpenGL.cmake在Windows环境下默认不会检索VCPKG提供的EGL组件,导致识别失败。
解决步骤
方案1:手动定位EGL库
修改CMakeLists.txt,先手动查找EGL的头文件和库文件,再创建导入目标:
cmake_minimum_required(VERSION 3.8) # 手动查找EGL find_path(EGL_INCLUDE_DIR NAMES EGL/egl.h PATHS ${VCPKG_INSTALLED_DIR}/x64-windows/include) find_library(EGL_LIBRARY NAMES libEGL PATHS ${VCPKG_INSTALLED_DIR}/x64-windows/lib) if(NOT EGL_INCLUDE_DIR OR NOT EGL_LIBRARY) message(FATAL_ERROR "EGL library not found!") endif() # 创建EGL导入目标 add_library(EGL::EGL UNKNOWN IMPORTED) set_target_properties(EGL::EGL PROPERTIES IMPORTED_LOCATION "${EGL_LIBRARY}" INTERFACE_INCLUDE_DIRECTORIES "${EGL_INCLUDE_DIR}" ) # 查找原生OpenGL find_package(OpenGL REQUIRED COMPONENTS OpenGL) include_directories(EGL::EGL OpenGL::GL) set (GL_HEADERS quegl.h ) set (GL_SOURCES quegl.cpp ) add_library (quillkhronos SHARED ${GL_HEADERS} ${GL_SOURCES} ) target_link_libraries (quillkhronos LINK_PUBLIC quill EGL::EGL OpenGL::GL )
方案2:直接依赖ANGLE包
VCPKG中的EGL属于ANGLE包,直接查找ANGLE来获取EGL组件:
cmake_minimum_required(VERSION 3.8) find_package(ANGLE REQUIRED) find_package(OpenGL REQUIRED COMPONENTS OpenGL) include_directories(ANGLE::EGL OpenGL::GL) set (GL_HEADERS quegl.h ) set (GL_SOURCES quegl.cpp ) add_library (quillkhronos SHARED ${GL_HEADERS} ${GL_SOURCES} ) target_link_libraries (quillkhronos LINK_PUBLIC quill ANGLE::EGL OpenGL::GL )
方案3:确认VCPKG工具链加载
确保CMake配置时指定了VCPKG工具链文件,示例命令:
cmake .. -DCMAKE_TOOLCHAIN_FILE=C:/projects/vcpkg/scripts/buildsystems/vcpkg.cmake
验证
修改后重新运行CMake,即可成功识别EGL库并完成项目配置。
内容的提问来源于stack exchange,提问作者Pablo Yaggi
相关产品推荐
相关产品推荐

