使用 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 不应包含任何绝对路径,它应该是您与源文件一起与其他人共享的文件。
话虽如此,眼前的问题可能来自这个问题:
target_link_libraries(${PROJECT} PRIVATE engine SDL2::SDL2main)
我猜你的可执行文件 #include
在某些时候来自 engine
的一些 header。应该是engine.hpp
吧?
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
.
的东西
如标题所述,我正在尝试将 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 不应包含任何绝对路径,它应该是您与源文件一起与其他人共享的文件。
话虽如此,眼前的问题可能来自这个问题:
target_link_libraries(${PROJECT} PRIVATE engine SDL2::SDL2main)
我猜你的可执行文件
#include
在某些时候来自engine
的一些 header。应该是engine.hpp
吧?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
.