Нужна помощь, включая файлы заголовков в CMakeC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Нужна помощь, включая файлы заголовков в CMake

Сообщение Anonymous »

Я относительно новичок в использовании CMake, и у меня возникла проблема, которую я не знаю, как решить.
Прежде всего, контекст. Структура моего проекта такова:

Код: Выделить всё

├── project/
│   ├── bin/
│   ├── framework/
│   │   ├── CMakeLists.txt
│   │   ├── include/
│   │   └── src/
│   ├── engine/
│   │   ├── CMakeLists.txt
│   │   ├── include/
│   │   └── src/
│   ├── core/
│   │   ├── CMakeLists.txt
│   │   ├── include/
│   │   └── src/
│   ├── vendor/
│   └── CMakeLists.txt
│   └── main.cpp
│   └── commands.h
│   └── commands.cpp
project/framework/CMakeLists.txt:

Код: Выделить всё

cmake_minimum_required(VERSION 3.31.0)
project(FrameworkLib)
set(CMAKE_CXX_FLAGS "-O3 -std=c++17 -Wall")

file(GLOB_RECURSE FRAMEWORK_SOURCES src/*.cpp)
add_library(FrameworkLib STATIC ${FRAMEWORK_SOURCES})

target_include_directories(FrameworkLib PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/include
)

target_link_libraries(FrameworkLib PRIVATE SDL2::SDL2 SDL2_image SDL2_mixer SDL2_net SDL2_ttf)
project/engine/CMakeLists.txt:

Код: Выделить всё

cmake_minimum_required(VERSION 3.31.0)
project(EngineLib)
set(CMAKE_CXX_FLAGS "-O3 -std=c++17 -Wall")

file(GLOB_RECURSE ENGINE_SOURCES src/*.cpp)
add_library(EngineLib STATIC ${ENGINE_SOURCES})

target_include_directories(EngineLib PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR}/../framework
)

target_link_libraries(EngineLib PRIVATE FrameworkLib SDL2::SDL2 SDL2_image SDL2_mixer SDL2_net SDL2_ttf)
project/core/CMakeLists.txt:

Код: Выделить всё

cmake_minimum_required(VERSION 3.31.0) \ project(CoreLib)
set(CMAKE_CXX_FLAGS "-O3 -std=c++17 -Wall")

file(GLOB_RECURSE CORE_SOURCES src/*.cpp)
add_library(CoreLib STATIC ${CORE_SOURCES})

target_include_directories(CoreLib PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR}/../framework \ ${CMAKE_CURRENT_SOURCE_DIR}/../engine \ )

target_link_libraries(CoreLib PRIVATE FrameworkLib EngineLib SDL2::SDL2 SDL2_image SDL2_mixer SDL2_net SDL2_ttf)
project/CMakeLists.txt:

Код: Выделить всё

cmake_minimum_required(VERSION 3.31.0)

project(Arkwright)
set(CMAKE_CXX_FLAGS "-O3 -std=c++20 -Wall")

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR})

set(FETCHCONTENT_BASE_DIR ${CMAKE_SOURCE_DIR}/vendor)
include(FetchContent)

# SDL2
FetchContent_Declare(
SDL2
URL https://www.libsdl.org/release/SDL2-2.30.9.tar.gz
)
FetchContent_MakeAvailable(SDL2)

# SDL2_image
FetchContent_Declare(
SDL2_image
URL https://www.libsdl.org/projects/SDL_image/release/SDL2_image-2.8.2.tar.gz
)
FetchContent_MakeAvailable(SDL2_image)

# SDL2_mixer
FetchContent_Declare(
SDL2_mixer
URL https://www.libsdl.org/projects/SDL_mixer/release/SDL2_mixer-2.8.0.tar.gz
)
FetchContent_MakeAvailable(SDL2_mixer)

# SDL2_net
FetchContent_Declare(
SDL2_net
URL https://www.libsdl.org/projects/SDL_net/release/SDL2_net-2.2.0.tar.gz
)
FetchContent_MakeAvailable(SDL2_net)

# SDL2_ttf
FetchContent_Declare(
SDL2_ttf
URL https://www.libsdl.org/projects/SDL_ttf/release/SDL2_ttf-2.22.0.tar.gz
)
FetchContent_MakeAvailable(SDL2_ttf)

add_subdirectory(core)
add_subdirectory(framework)
add_subdirectory(engine)

file(GLOB_RECURSE MAIN_SOURCES core/src/*.cpp)

add_executable(Arkwright ${MAIN_SOURCES})

target_include_directories(Arkwright PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/framework/include
${CMAKE_CURRENT_SOURCE_DIR}/engine/include
${CMAKE_CURRENT_SOURCE_DIR}/core/include
)

target_link_libraries(Arkwright PRIVATE EngineLib SDL2::SDL2 SDL2_image SDL2_mixer SDL2_net SDL2_ttf)
Ну, когда я ввожу cmake.. (находясь в папке bin), всё работает корректно. Но когда я ввожу cmake --build ., мне выдается такая ошибка:

Код: Выделить всё

In file included from /home/yawin/Dokumentuak/Proyectos/Gamedev/Arkwright/src/engine/include/actor.h:27,
from /home/yawin/Dokumentuak/Proyectos/Gamedev/Arkwright/src/engine/src/actor.cpp:22:
/home/yawin/Dokumentuak/Proyectos/Gamedev/Arkwright/src/engine/include/sprite.h:27:10: fatal error: framework/rf_process.h: No existe el fichero o el directorio
27 | #include "framework/rf_process.h"
Я думаю, проблема в том, что я включаю его как framework/file.h и, учитывая способ включения папок каталога, мне нужно просто поместить файл .х. Но для ясности я бы хотел, чтобы заголовки фреймворка были включены как framework/file.h, заголовки движка как engine/file.h и основные заголовки как core/file.h< /code>.
С другой стороны, у меня такое ощущение, что даже несмотря на то, что SDL2 и его модули загружены, когда я делаю #include это включая заголовки, которые я установил в системе. Но это всего лишь мое мнение, я не смог это проверить.
Что мне нужно изменить, чтобы это заработало?

Подробнее здесь: https://stackoverflow.com/questions/791 ... s-in-cmake
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»