«Не удается открыть файл включения» при реализации библиотеки, реализующей GLM с использованием CMake - PullRequest
1 голос
/ 23 марта 2020

Я создаю игру, используя opengl, glfw и glm. Теперь у меня есть два проекта, движок (названный Cheetah) и игра. Движок - это библиотека dll, и игра реализует эту библиотеку. И движок, и игровые проекты содержат CMakeLists.txt, и существует один CMakeLists.txt верхнего уровня, который создает оба. Структура папок выглядит следующим образом:

folder structure of project

Проблема

Я пытаюсь добавить glm к библиотеки, но сейчас я сталкиваюсь с проблемой, что я могу собрать свою библиотеку, но я не могу собрать игровой проект, который реализует библиотеку, выдавая ошибку компиляции:

Ошибка C1083 Не удается открыть включаемый файл: 'glm / common.hpp': нет такого файла или каталога C: \ Projects \ Game \ out \ build \ x64-Debug \ Game C: \ Projects \ Game \ Cheetah \ src \ Engine \ Renderer \ OrthoGraphicCamera.h

Вот файлы CMake для проекта:

Гепард (проект Engine)

# CMakeList.txt : CMake project for Cheetah, include source and define
# project specific logic here.
#
cmake_minimum_required (VERSION 3.8)
project ("Cheetah")

# Platform defines
IF (WIN32)
  add_compile_definitions(CH_PLATFORM_WINDOWS)
ELSE()
  # set stuff for other systems
ENDIF()

#----------------------------------------------
# ADD CHEETAH LIBRARY
#----------------------------------------------
message(${PROJECT_SOURCE_DIR})
# Define Cheetah variables
set(LIB_DIR "${PROJECT_SOURCE_DIR}/dependencies")
set(INCLUDES_DIR_PUBLIC "${PROJECT_SOURCE_DIR}/includes")
set(INCLUDES_DIR_PRIVATE "${PROJECT_SOURCE_DIR}/src")
set(ENGINE_DIR "${PROJECT_SOURCE_DIR}/src/Engine")
set(ENGINE_CORE_DIR "${ENGINE_DIR}/Core")
set(ENGINE_INPUT_DIR "${ENGINE_DIR}/Input")
set(ENGINE_EVENTS_DIR "${ENGINE_DIR}/Events")
set(ENGINE_RENDERER_DIR "${ENGINE_DIR}/Renderer")
set(ENGINE_DEBUG_DIR "${ENGINE_DIR}/Debug")
set(ENGINE_MATH_DIR "${ENGINE_DIR}/Math")
set(ENGINE_RESOURCES_DIR "${ENGINE_DIR}/Resources")
set(PLATFORM_DIR "${PROJECT_SOURCE_DIR}/src/Platform")
set(PLATFORM_WINDOWS_DIR "${PLATFORM_DIR}/Windows")
set(PLATFORM_OPENGL_DIR "${PLATFORM_DIR}/OpenGL")

# Set default files
list(APPEND SOURCE_FILES    
    "${ENGINE_DIR}/Engine.h"
    "${ENGINE_CORE_DIR}/Application.h"
    "${ENGINE_CORE_DIR}/Application.cpp"
    "${ENGINE_CORE_DIR}/Core.h"
    "${ENGINE_CORE_DIR}/EntryPoint.h"
    "${ENGINE_CORE_DIR}/Window.h"
    "${ENGINE_CORE_DIR}/UpdateLayer.h"
    "${ENGINE_CORE_DIR}/UpdateLayer.cpp"
    "${ENGINE_CORE_DIR}/UpdateLayerQueue.h"
    "${ENGINE_CORE_DIR}/UpdateLayerQueue.cpp"
    "${ENGINE_CORE_DIR}/Time.h"
    "${ENGINE_CORE_DIR}/Time.cpp"
    "${ENGINE_RENDERER_DIR}/RenderAction.h"
    "${ENGINE_RENDERER_DIR}/RenderAction.cpp"
    "${ENGINE_RENDERER_DIR}/GraphicsContext.h"
    "${ENGINE_RENDERER_DIR}/GraphicsContext.cpp"
    "${ENGINE_RENDERER_DIR}/RenderAPI.h"
    "${ENGINE_RENDERER_DIR}/RenderAPI.cpp"
    "${ENGINE_RENDERER_DIR}/Renderer.h"
    "${ENGINE_RENDERER_DIR}/Renderer.cpp"
    "${ENGINE_RENDERER_DIR}/Renderer2D.h"
    "${ENGINE_RENDERER_DIR}/Renderer2D.cpp"
    "${ENGINE_RENDERER_DIR}/IndexBuffer.h"
    "${ENGINE_RENDERER_DIR}/IndexBuffer.cpp"
    "${ENGINE_RENDERER_DIR}/VertexBuffer.h"
    "${ENGINE_RENDERER_DIR}/VertexBuffer.cpp"
    "${ENGINE_RENDERER_DIR}/VertexArray.h"
    "${ENGINE_RENDERER_DIR}/VertexArray.cpp"
    "${ENGINE_RENDERER_DIR}/Shader.h"
    "${ENGINE_RENDERER_DIR}/Shader.cpp"
    "${ENGINE_RENDERER_DIR}/VertexBufferLayout.h"
    "${ENGINE_RENDERER_DIR}/VertexBufferLayout.cpp"
    "${ENGINE_RENDERER_DIR}/Texture.h"
    "${ENGINE_RENDERER_DIR}/Texture.cpp"
    "${ENGINE_RENDERER_DIR}/OrthoGraphicCamera.h"
    "${ENGINE_RENDERER_DIR}/OrthoGraphicCamera.cpp"
    "${ENGINE_RENDERER_DIR}/Renderer2DQueue.h"
    "${ENGINE_RENDERER_DIR}/Renderer2DQueue.cpp"
    "${ENGINE_INPUT_DIR}/Input.h"
    "${ENGINE_INPUT_DIR}/Input.cpp"
    "${ENGINE_EVENTS_DIR}/ApplicationEvents.h"
    "${ENGINE_EVENTS_DIR}/ApplicationEvents.cpp"
    "${ENGINE_EVENTS_DIR}/Event.h"
    "${ENGINE_EVENTS_DIR}/Event.cpp"
    "${ENGINE_EVENTS_DIR}/EventDispatcher.h"
    "${ENGINE_EVENTS_DIR}/EventDispatcher.cpp"
    "${ENGINE_EVENTS_DIR}/EventTypes.h"
    "${ENGINE_EVENTS_DIR}/InputEvents.h"
    "${ENGINE_EVENTS_DIR}/InputEvents.cpp"
    "${ENGINE_RESOURCES_DIR}/ResourceCache.h"
    "${ENGINE_RESOURCES_DIR}/ResourceCache.inl"
    "${ENGINE_RESOURCES_DIR}/ResourceLoader.h"
    "${ENGINE_RESOURCES_DIR}/ResourceLoader.cpp"
)
# Set platform specific files
# Windows
list(APPEND SOURCE_FILES_WINDOWS
    "${PLATFORM_WINDOWS_DIR}/WindowsWindow.h"
    "${PLATFORM_WINDOWS_DIR}/WindowsWindow.cpp"
    "${PLATFORM_WINDOWS_DIR}/WindowsTime.h"
    "${PLATFORM_WINDOWS_DIR}/WindowsTime.cpp"
    "${PLATFORM_WINDOWS_DIR}/WindowsInput.h"
    "${PLATFORM_WINDOWS_DIR}/WindowsInput.cpp"
)

# OpenGL
list(APPEND SOURCE_FILES_OPENGL
    "${PLATFORM_OPENGL_DIR}/OpenGLRenderAPI.h"
    "${PLATFORM_OPENGL_DIR}/OpenGLRenderAPI.cpp"
    "${PLATFORM_OPENGL_DIR}/OpenGLGraphicsContext.h"
    "${PLATFORM_OPENGL_DIR}/OpenGLGraphicsContext.cpp"
    "${PLATFORM_OPENGL_DIR}/OpenGLVertexBuffer.h"
    "${PLATFORM_OPENGL_DIR}/OpenGLVertexBuffer.cpp"
    "${PLATFORM_OPENGL_DIR}/OpenGLIndexBuffer.h"
    "${PLATFORM_OPENGL_DIR}/OpenGLIndexBuffer.cpp"
    "${PLATFORM_OPENGL_DIR}/OpenGLShader.h"
    "${PLATFORM_OPENGL_DIR}/OpenGLShader.cpp"
    "${PLATFORM_OPENGL_DIR}/OpenGLVertexArray.h"
    "${PLATFORM_OPENGL_DIR}/OpenGLVertexArray.cpp"
    "${PLATFORM_OPENGL_DIR}/OpenGLTexture.h"
    "${PLATFORM_OPENGL_DIR}/OpenGLTexture.cpp"
)

list(APPEND SOURCE_FILES ${SOURCE_FILES_OPENGL})

# Append Platform specific files
# Operating platform
IF (WIN32)
  list(APPEND SOURCE_FILES ${SOURCE_FILES_WINDOWS})
  # TODO: Linux
  # TODO: MacOS
  # TODO: Android
  # TODO: IOS
ENDIF()

# Add source to this project's executable.
add_library(Cheetah SHARED ${SOURCE_FILES})

target_include_directories (Cheetah INTERFACE ${INCLUDES_DIR_PUBLIC})
target_include_directories (Cheetah PRIVATE ${ENGINE_DIR})
target_include_directories (Cheetah PRIVATE ${INCLUDES_DIR_PRIVATE})

# Add compile definitions
list(APPEND CHEETAH_COMP_DEFS
    "CH_BUILD_DLL"
    ${RENDER_API}
)

target_compile_definitions(Cheetah PRIVATE ${CHEETAH_COMP_DEFS})
target_compile_definitions(Cheetah PUBLIC "$<$<CONFIG:DEBUG>:DEBUG>")
target_compile_definitions(Cheetah PUBLIC "$<$<CONFIG:DEBUG>:CH_ASSERT_ENABLED>")

set_target_properties(Cheetah PROPERTIES LINKER_LANGUAGE CXX)
# Copy dll to game project build folder

IF(${APPLICATION_NAME})
message("---------------------------------------------------------------------")
add_custom_command(
    TARGET Cheetah 
    POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy_if_different
    "${PROJECT_BINARY_DIR}/Cheetah.dll"
    "${PROJECT_BINARY_DIR}/${APPLICATION_NAME}"
)
ENDIF()

#----------------------------------------------
# ADD OPENGL LIBRARY DEPENDENCY
#----------------------------------------------
find_package(OpenGL REQUIRED)
target_link_libraries(Cheetah ${OpenGL})

#----------------------------------------------
# ADD GLFW LIBRARY DEPENDENCY
#----------------------------------------------
set(GLFW_DIR "${LIB_DIR}/glfw")
set(GLFW_BUILD_EXAMPLES OFF CACHE INTERNAL "Build the GLFW example programs")
set(GLFW_BUILD_TESTS OFF CACHE INTERNAL "Build the GLFW test programs")
set(GLFW_BUILD_DOCS OFF CACHE INTERNAL "Build the GLFW documentation")
set(GLFW_INSTALL OFF CACHE INTERNAL "Generate installation target")
add_subdirectory("${GLFW_DIR}")
target_include_directories(Cheetah PRIVATE "${GLFW_DIR}/include")
target_link_libraries(Cheetah "glfw" "${GLFW_LIBRARIES}")
target_compile_definitions(Cheetah PRIVATE "GLFW_INCLUDE_NONE")

#----------------------------------------------
# ADD GLAD LIBRARY DEPENDENCY
#----------------------------------------------
set(GLAD_DIR "${LIB_DIR}/glad")
add_library("glad" "${GLAD_DIR}/src/glad.c")
target_include_directories("glad" PRIVATE "${GLAD_DIR}/include")
target_include_directories(Cheetah PUBLIC "${GLAD_DIR}/include")
target_link_libraries(Cheetah "glad" "${CMAKE_DL_LIBS}")

#----------------------------------------------
# ADD STB_IMAGE LIBRARY DEPENDENCY
#----------------------------------------------
set(STB_IMAGE_DIR "${LIB_DIR}/stb_image")
add_library("stb_image" "${STB_IMAGE_DIR}/stb_image.cpp")
target_include_directories("stb_image" PRIVATE "${STB_IMAGE_DIR}/include")
target_include_directories(Cheetah PUBLIC "${STB_IMAGE_DIR}/include")
target_link_libraries(Cheetah "stb_image" "${CMAKE_DL_LIBS}")

#---------------------------------------------
# ADD GLM LIBRARY DEPENDENCY
# --------------------------------------------
set(GLM_DIR "${LIB_DIR}/glm")
add_subdirectory("${LIB_DIR}/glm")
target_include_directories(Cheetah PRIVATE "${GLM_DIR}/glm")
target_link_libraries(Cheetah glm)

Игра

# CMakeList.txt : CMake project for Cheetah, include source and define
# project specific logic here.
#
cmake_minimum_required (VERSION 3.13)

set(SOURCE_DIR "${PROJECT_SOURCE_DIR}/Game/src")

list(APPEND SOURCE_FILES 
    "${SOURCE_DIR}/Main.cpp"
    "${SOURCE_DIR}/GameLayer.cpp"
    "${SOURCE_DIR}/GameLayer.h"
    "${SOURCE_DIR}/GameObject.h"
    "${SOURCE_DIR}/GameObject.cpp"
    "${SOURCE_DIR}/Scene.h"
    "${SOURCE_DIR}/Scene.cpp"
    "${SOURCE_DIR}/GameScene.h"
    "${SOURCE_DIR}/GameScene.cpp"
)

# Platform defines
IF (WIN32)
  add_compile_definitions(CH_PLATFORM_WINDOWS)
ELSE()
  # set stuff for other systems
ENDIF()

find_library( CHEETAH_LIB 
    NAMES Cheetah
    HINTS "${CMAKE_BINARY_DIR}/Cheetah")

# Add source to this project's executable.
add_executable (Game ${SOURCE_FILES})

target_include_directories(Game PUBLIC "${PROJECT_SOURCE_DIR}/Cheetah/includes")

# TODO: Add tests and install targets if needed.

target_link_libraries(Game ${CHEETAH_LIB})

Верхний уровень CMakeList

# CMakeList.txt : Top-level CMake project file, do global configuration
# and include sub-projects here.
#
cmake_minimum_required (VERSION 3.8)

project ("Game")

set(APPLICATION_NAME "Game")
set(RENDER_API "OPENGL")

# Include sub-projects.
add_subdirectory("Cheetah")
add_subdirectory ("Game")

Все, что может направить меня в правильном направлении, очень ценится!

1 Ответ

1 голос
/ 24 марта 2020

Включаемые каталоги, которые вы указываете для цели Game, представляют собой довольно короткий список по сравнению с тем, что вы указываете для Cheetah:

target_include_directories(Game PUBLIC "${PROJECT_SOURCE_DIR}/Cheetah/includes")

Кажется, вам могут понадобиться некоторые из этих Cheetah Включите каталоги для Game.

Примечание. Если вы хотите реорганизовать дизайн этих двух проектов, чтобы всегда использовать файл верхнего уровня CMake, нет необходимости использовать find_library() для поиска Cheetah библиотека. CMake уже знает о цели Cheetah, поскольку она была только что создана! Файл Game CMakeLists.txt может выглядеть следующим образом:

# CMakeList.txt : CMake project for Game, include source and define
# project specific logic here.
#
cmake_minimum_required (VERSION 3.13)

set(SOURCE_DIR "${PROJECT_SOURCE_DIR}/Game/src")

list(APPEND SOURCE_FILES 
    "${SOURCE_DIR}/Main.cpp"
    "${SOURCE_DIR}/GameLayer.cpp"
    "${SOURCE_DIR}/GameLayer.h"
    "${SOURCE_DIR}/GameObject.h"
    "${SOURCE_DIR}/GameObject.cpp"
    "${SOURCE_DIR}/Scene.h"
    "${SOURCE_DIR}/Scene.cpp"
    "${SOURCE_DIR}/GameScene.h"
    "${SOURCE_DIR}/GameScene.cpp"
)

# Platform defines
# Note, this block can also be removed if target_compile_definitions 
#  is used for Cheetah instead.
IF (WIN32)
  add_compile_definitions(CH_PLATFORM_WINDOWS)
ELSE()
  # set stuff for other systems
ENDIF()

# Add source to this project's executable.
add_executable (Game ${SOURCE_FILES})

# TODO: Add tests and install targets if needed.

target_link_libraries(Game PUBLIC Cheetah)

Цель Cheetah будет нести все включенные каталоги вместе с ней, поэтому нет необходимости перечислять их все по отдельности снова. Он также может распространять определения компиляции, просто используйте target_compile_definitions() при определении их для цели Cheetah.

...