CMake - это просто генератор системы сборки.Что в конечном итоге входит в окончательный исполняемый файл, решается компоновщиком и какими опциями вы пользуетесь.Типичные компоновщики будут связывать в исполняемый файл только то, что они могут определить как необходимые - если вы не попросите их связать все.Однако есть некоторые ограничения на то, насколько они могут уменьшить занимаемую площадь.
Практическое правило заключается в том, что если вы используете функцию, найденную в foo.o, тогда весь массив foo.o будет связан;следовательно, если целью вашей оптимизации является оптимизация, то лучше дать каждой функции свой собственный модуль компиляции.
Какие используемые вами заголовки не имеют никакого эффекта, поскольку заголовки обрабатываются во время компиляции, а не во время компоновки.
И последнее, но не менее важное: в большинстве реализаций стандартной библиотеки семейство функций printf является одним из самых тяжелых, поэтому не используйте их, если вы собираетесь.