Поскольку мы хотели избежать дополнительных затрат на изменение "version.cpp" или его эквивалента каждый раз, когда мы нажимаем на сборку - и, таким образом, тратим время на выполнение хотя бы одной компиляции и ссылки - мы модифицируем двоичный файл после сборки.
Если вы выводите, например, на Исполняемые файлы формата ELF или PE, вы можете использовать некоторые базовые знания ELF или PE и карту компоновщика, чтобы выяснить, что заменить, в противном случае вы можете сканировать двоичный файл в поисках заданного шаблона (мы используем что-то вроде статического константного символа VERSION [] = "[VERSIONBLOCK xxxxxxxxxxxxx]";) и заменить часть (например, часть xxxx выше) соответствующей информацией:
- дата и время сборки
- сборка машины
- имя пользователя
- выход, например svnversion
Обратите внимание, что это не будет работать очень хорошо, если ваши двоичные файлы подписаны или сжаты до этого шага, но обычно вы можете спроектировать процесс сборки так, чтобы подписывание / сжатие происходило после этого шага.
Я уверен, что вариант этого может быть расширен, чтобы охватить метаданные версии Win32 PE, а также любую строку встроенной версии.