# 版本要求 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 ) # 将着色器文件复制到可执行文件旁边 foreach (SHADER_FILE ${SHADER_FILES}) add_custom_command( TARGET OpenGLProject POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory $/shaders COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${SHADER_FILE} $/shaders/ COMMENT "Copying shader ${SHADER_FILE} to build directory" ) endforeach () # 创建目标 shaders 目录 add_custom_command( TARGET OpenGLProject POST_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory $/shaders COMMENT "Creating shaders directory in build output" )