使用 CMake find_package() 时无法打开源文件 "GL/glew.h"

Cannot open source file "GL/glew.h" when using CMake find_package()

如标题所述,我正在尝试将 glew.h 添加到我在 Visual Studio 2019 (Windows 10) 使用 CMake 构建的项目中,并且在这样做时我遇到了在构建阶段抛出错误 fatal error C1083: Cannot open include file: 'GL/glew.h': No such file or directory

我将其包含在 engine.hpp#include <GL/glew.h>

CMakeLists.txt

cmake_minimum_required (VERSION 3.8)

set(PROJECT GUI_Engine)

add_executable (${PROJECT} "./src/driver/main.cpp")

set(HEADER_FILES ./src/include)
set(DEC_FILES ./src/lib)
set(PKGPATH C:/dev/vcpkg/packages)

add_library(engine ${DEC_FILES}/engine.cpp ${HEADER_FILES}/engine.hpp)

list(APPEND CMAKE_PREFIX_PATH ${PKGPATH}/sdl2_x64-windows)
find_package(SDL2 CONFIG REQUIRED)
target_link_libraries(${PROJECT} PRIVATE engine SDL2::SDL2main)
target_link_libraries(engine PRIVATE SDL2::SDL2)

list(APPEND CMAKE_PREFIX_PATH ${PKGPATH}/glew_x64-windows)
find_package(GLEW REQUIRED)
target_link_libraries(engine PRIVATE GLEW::GLEW)

如有任何帮助,我们将不胜感激,对于我的经验不足,我深表歉意,谢谢!

如果您使用 vcpkg,您应该只使用 vcpkg 的 CMake 集成并让它处理细节。您的 CMakeLists.txt 不应包含任何绝对路径,它应该是您与源文件一起与其他人共享的文件。

话虽如此,眼前的问题可能来自这个问题:

  1. target_link_libraries(${PROJECT} PRIVATE engine SDL2::SDL2main)

    我猜你的可执行文件 #include 在某些时候来自 engine 的一些 header。应该是engine.hpp吧?

  2. target_link_libraries(engine PRIVATE GLEW::GLEW)

    让 Glew 可供 engine 使用,但不公开。也就是说:仅在构建引擎本身时,而不是在构建其他任何东西时(特别是在构建主要可执行文件时)。

从第1点开始,对Glew的依赖暴露在engine的API中,所以是public依赖。所以你应该在 2.:

中将其标记为 PUBLIC
target_link_libraries(engine PUBLIC GLEW::GLEW)

一旦 CMake 知道依赖项已公开,它还会使 Glew 可用于任何使用 engine.

的东西