120 lines
3.6 KiB
CMake
120 lines
3.6 KiB
CMake
# 版本要求
|
||
cmake_minimum_required(VERSION 3.31)
|
||
|
||
# 项目名称和语言
|
||
project(opengl_homework LANGUAGES CXX)
|
||
|
||
# C++ 标准
|
||
set(CMAKE_CXX_STANDARD 11)
|
||
set(CMAKE_CXX_STANDARD_REQUIRED True)
|
||
|
||
# 自动运行 MOC, UIC, RCC (如果使用 Qt,这里不需要)
|
||
#set(CMAKE_AUTOMOC ON)
|
||
#set(CMAKE_AUTOUIC ON)
|
||
#set(CMAKE_AUTORCC ON)
|
||
|
||
# 包含目录
|
||
include_directories(include)
|
||
|
||
# GLEW: 作为静态库链接或动态库
|
||
# 查找GLEW
|
||
find_package(GLEW REQUIRED)
|
||
if (GLEW_FOUND)
|
||
include_directories(${GLEW_INCLUDE_DIRS})
|
||
message(STATUS "Found GLEW: ${GLEW_LIBRARIES}")
|
||
else ()
|
||
message(FATAL_ERROR "GLEW not found")
|
||
endif ()
|
||
|
||
# 查找OpenGL
|
||
find_package(OpenGL REQUIRED)
|
||
if (OPENGL_FOUND)
|
||
include_directories(${OPENGL_INCLUDE_DIR})
|
||
message(STATUS "Found OpenGL: ${OPENGL_gl_LIBRARY}")
|
||
else ()
|
||
message(FATAL_ERROR "OpenGL not found")
|
||
endif ()
|
||
|
||
# 查找GLUT
|
||
find_package(GLUT REQUIRED)
|
||
if (GLUT_FOUND)
|
||
include_directories(${GLUT_INCLUDE_DIR})
|
||
message(STATUS "Found GLUT: ${GLUT_glut_LIBRARY}")
|
||
else ()
|
||
message(FATAL_ERROR "GLUT not found")
|
||
endif ()
|
||
|
||
# GLM (OpenGL Mathematics Library)
|
||
# 尝试查找系统安装的GLM
|
||
find_package(glm QUIET)
|
||
if (NOT glm_FOUND)
|
||
message(STATUS "glm not found. Fetching from source...")
|
||
include(FetchContent)
|
||
FetchContent_Declare(
|
||
glm
|
||
GIT_REPOSITORY https://github.com/g-truc/glm.git
|
||
GIT_TAG 0.9.9.8 # 你可以选择一个具体的tag或者分支
|
||
)
|
||
FetchContent_MakeAvailable(glm)
|
||
# 对于FetchContent下载的glm,其include目录通常是 ${glm_SOURCE_DIR}
|
||
# 对于一些版本的CMake/glm,可能是 ${glm_SOURCE_DIR}/glm
|
||
# 为了保险起见,可以都添加,或者根据实际下载的结构调整
|
||
include_directories(${glm_SOURCE_DIR})
|
||
message(STATUS "Fetched glm and added include directory: ${glm_SOURCE_DIR}")
|
||
else ()
|
||
message(STATUS "Found system-installed glm: ${glm_INCLUDE_DIR}")
|
||
include_directories(${glm_INCLUDE_DIR})
|
||
endif ()
|
||
|
||
|
||
# 创建 shaders 目录的引用,方便在代码中加载 (可选)
|
||
# set(SHADER_DIR ${CMAKE_CURRENT_SOURCE_DIR}/shaders)
|
||
|
||
# 添加可执行文件
|
||
add_executable(OpenGLProject
|
||
main.cpp
|
||
shader_utils.cpp
|
||
)
|
||
|
||
# 链接库
|
||
target_link_libraries(OpenGLProject
|
||
PRIVATE
|
||
${OPENGL_LIBRARIES}
|
||
${GLEW_LIBRARIES}
|
||
${GLUT_glut_LIBRARY}
|
||
)
|
||
|
||
# 如果GLEW是作为静态库链接的,可能需要定义GLEW_STATIC
|
||
# target_compile_definitions(OpenGLProject PRIVATE GLEW_STATIC)
|
||
|
||
# 为了确保着色器文件能被程序找到,可以将它们复制到构建目录
|
||
# 或者在代码中指定相对或绝对路径
|
||
# 这里我们假设着色器文件和可执行文件在同一目录下运行,或者代码中处理路径
|
||
# 如果着色器在 "shaders" 子目录中:
|
||
set(SHADER_FILES
|
||
shaders/phong.vert
|
||
shaders/phong.frag
|
||
shaders/axes.vert
|
||
shaders/axes.frag
|
||
)
|
||
|
||
# 将着色器文件复制到可执行文件旁边
|
||
foreach (SHADER_FILE ${SHADER_FILES})
|
||
add_custom_command(
|
||
TARGET OpenGLProject POST_BUILD
|
||
COMMAND ${CMAKE_COMMAND} -E make_directory $<TARGET_FILE_DIR:OpenGLProject>/shaders
|
||
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||
${CMAKE_CURRENT_SOURCE_DIR}/${SHADER_FILE}
|
||
$<TARGET_FILE_DIR:OpenGLProject>/shaders/
|
||
COMMENT "Copying shader ${SHADER_FILE} to build directory"
|
||
)
|
||
endforeach ()
|
||
|
||
# 创建目标 shaders 目录
|
||
add_custom_command(
|
||
TARGET OpenGLProject POST_BUILD
|
||
COMMAND ${CMAKE_COMMAND} -E make_directory $<TARGET_FILE_DIR:OpenGLProject>/shaders
|
||
COMMENT "Creating shaders directory in build output"
|
||
)
|
||
|