Как улучшить мой скрипт и скопировать программные ресурсы при сборке? - PullRequest
0 голосов
/ 02 июня 2018

Итак, я столкнулся с проблемой, когда мне нужно было некоторое время использовать linux вместо windows, и я подумал, что в linux нет Visual Studio.Затем я также осознал, что создал свой проект только для Visual Studio, что мне не нужно.

Поэтому я просмотрел несколько руководств по CMake и попытался создать несколько примеров, которые можно было бы загрузить как в Visual Studio, так и в CodeBlocks.,Когда я заставил это работать, я пошел и написал код сценария CMake для моей настоящей программы, объединив то, что я узнал и что я нашел в руководствах.Смотрите здесь:

cmake_minimum_required(VERSION 2.8.9)

add_subdirectory(libraries/glfw)

project (OpenGLEngine3D)

include_directories(libraries/glfw/include)
include_directories(libraries/glm)
include_directories(libraries/glad/include)
include_directories(libraries/whereami/src)
include_directories(libraries/stb)

file(GLOB SOURCES "src/*.cpp" "src/*.h" "libraries/whereami/src/whereami.c" "libraries/glad/src/glad.c")

add_executable(OpenGLEngine3D  ${SOURCES})
target_link_libraries(OpenGLEngine3D glfw)

Это грязно (я думаю), но это работает.Итак, теперь мой первый вопрос состоит в том, как улучшить мой сценарий CMake?Что излишне или сделано плохо?

Теперь моей программе также требуются некоторые ресурсы (например, шейдеры, текстуры), которые я хранил в каталоге вместе со своим сценарием CMake, библиотеками и файлами c ++.Итак, мой второй вопрос состоит в том, как я могу сказать CMake для ide / compiler, чтобы он копировал файлы в определенном каталоге в каталог сборки программы (где находятся скомпилированные двоичные файлы) после компиляции?сделайте это, когда файлов там нет.)

Спасибо!

1 Ответ

0 голосов
/ 03 июня 2018

Я недавно натолкнулся на эту статью , которая может помочь вам с CMake.

Вот несколько предложений от меня:

  1. Вы можете использовать более новую версию CMake.В настоящее время это 3.11.Нет смысла придерживаться старых версий.

  2. Рассмотрите возможность перечисления всех ваших источников в переменной (используя set command ) вместо использования file(GLOB).file(GLOB) будет оцениваться только один раз при создании файлов сборки.Если вы добавляете новые источники, вам придется заново сгенерировать их вручную, так что это не слишком помогает и сложнее в отладке (и действительно, отладка более сложных проектов CMake может быть болезненной).

  3. Избегайте использования include_directorieslink_libraries).Предпочитаю использовать target_include_directories, который работает для каждой цели.Это позволяет выражать зависимости между целями (когда у вас их больше одного - что может произойти по мере роста вашего проекта)

  4. Вы можете рассмотреть возможность использования find_package(GLFW) вместо включения GLFW в ваш проект, Редактировать: на самом деле, CMake не поставляется с модулем поиска для GLFW, но вы можете использовать для этого внешний модуль (например, этот ), как описано здесь .

Редактировать:

Пример ниже иллюстрирует идею, стоящую за пунктом 2), предполагая, что источники помещаются в каталог "src /" натот же уровень, что и в файле CMakeLists.txt:

set(engine_sources
    "src/header_1.hpp"
    "src/source_1.cpp"
    # and so on for reset of files...
)

add_executable(OpenGLEngine3D ${engine_sources})

Что касается второго вопроса: для этого нужна file(COPY) команда .В качестве альтернативы, вы можете просто оставить ресурсы в исходном каталоге и установить рабочий каталог в IDE.

Примечание: если вы выберете второй вариант, кажется, есть способ установить это из CMake для Visual Studio, с помощьюнастройка VS_DEBUGGER_WORKING_DIRECTORY свойство:

set_target_properties(OpenGLEngine3D PROPERTIES VS_DEBUGGER_WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})

(Я не проверял, работает ли это должным образом, поскольку я редко использую VS. Я помню, что искал что-то подобное впрошлое и совсем недавно с ним сталкивались.)

...