Я работаю над своим первым проектом CMake / C, и я столкнулся с проблемой со своей сборкой, которая заставляет меня переспросить, как работает компиляция.
Я хотел бы, чтобы люди объяснили мне, что именно происходит когда вы вызываете add_executable и как make создает C файловых зависимостей.
Что я думал
Я думал, что при вызове add_executable (name, sources) , CMake будет видеть sources как расширенный набор необходимых исходных файлов для построения целевого имени. Поэтому он внутренне анализирует зависимости РЕАЛЬНОГО МИНИМАЛЬНОГО, анализируя файл, содержащий main
, и рекурсивно добавляет включенные файлы .h с соответствующими объявлениями в файлах. c.
Что, по-видимому, происходит (Я хочу подтверждение)
CMake видит sources как реальный минимум зависимостей для исполняемого файла. Кажется, он скомпилирует НИЧЕГО в sources , независимо от того, используется он где-либо или нет.
Следствие
Это для меня действительно раздражает. В моем проекте я использую обнаружение источников, то есть все, что находится в каталоге sr c, добавляется к источникам. Затем, если я хочу скомпилировать модульный тест (make this_unit_test
), он фактически собирается скомпилировать каждый файл .o в моем исходном каталоге вместо компиляции только необходимых файлов. Это означает, что если что-то не встраивается в часть моего проекта, я не могу больше строить тесты.
Что я могу сделать?
Если CMake действительно сделан так, как вы нужно указать себе минимальные зависимости для любого исполняемого файла, как я могу все еще использовать автоматическое c обнаружение источника / теста? Лучшее решение было бы из файла CMakeList, функции, которая берет список исходных файлов и возвращает его подмножество, соответствующее тому, что фактически включено в некоторый момент файлом, содержащим main
. Что люди делают, чтобы решить эту проблему?