1) каковы рекомендации по написанию мультиплатформенного файла CMakeLists.txt (который будет работать независимо от операционной системы и расположения файлов проекта), что предпочтительно позволит мне легко переключить конфигурацию моего проекта из одной операционной системыдругой?
Ну, я, конечно, не эксперт, но я могу поделиться своим 10-месячным опытом с кроссплатформенным проектом на основе cmake.
Сразуbat Я думаю, вам действительно следует использовать из исходных сборок .Это означает, что вы не запускаете cmake в той же директории, где находится ваш код;вместо этого вы создаете новую папку, например, engine/build
и запускаете cmake ../main
оттуда.Таким образом, вы не забиваете свои исходные файлы с помощью cmake, например, CMakeCache.txt и т. Д. Есть даже некоторые макросы, которые вы можете использовать, чтобы запретить пользователям делать сборки в исходном коде.
Я также нахожуполезно для создания набора макрофайлов, чтобы помочь установить параметры компилятора для разных платформ.Здесь, на работе, у нас есть макросы, такие как ADD_GCC_FLAG
или ADD_MSVC_FLAG
, которые проверяют текущий компилятор и соответственно добавляют флаги.
Я думаю, что хорошей практикой будет иметь один файл .cmake
, который концентрирует весь ваш проект.Конфигурации в одном месте.На работе все наши CMakeLists.txt
начинаются с include( ../cmake/configs.cmake )
.В этом файле задаются всевозможные параметры, такие как стандартные каталоги включения, флаги компилятора по умолчанию и т. Д.
Чтобы решить вашу проблему с каталогами включения, я предлагаю вам использовать абсолютные, а не относительные пути в исходных файлах.Определите стандартный каталог include, например, engine/main/include
и всегда #include
файлы относительно этого пути.В вашем примере, если вы хотите включить engine/main/include/somefolder/header.h
, вы должны написать #include <somefolder/header.h>
(использование <>
вместо кавычек указывает препроцессору C ++ пропускать текущий каталог при поиске файла).
2) как мне исправить ошибку, связанную с отсутствием заголовочного файла (make дает: (...) \ engine \ main \ src \ main.cc: 2: 17: фатальная ошибка: App.h: Такого файла или каталога нет)?
Существует ряд проблем с макетом cmake, но причина, по которой вы получили эту ошибку, заключается в том, что вам нужно вызвать include_directories
в CMakeLists.txt (1)
какну.
Кроме того, у других ваших CMakeLists.txt
файлов тоже есть проблемы.В CMakeLists.txt (2)
аргументы add_library
неверны;это должно быть ../src/App.cc
, иначе вы просто добавляете пустую библиотеку.И вам не нужно это set_target_properties
, по крайней мере, если вы правильно поняли add_library
аргументы.Вам также нужен include_directory
вызов в том же CMakeLists.txt
, который добавляет библиотеку;вставка в (3)
на самом деле ничего не делает.
На самом деле вам не нужен файл CMakeLists.txt
в каталоге include
, так как там нечего строить.Лучше ввести add_library
в CMakeLists.txt (3)
сразу после вызова include_directories
.
Надеюсь, это рассеет некоторые ваши сомнения.