Подтвердить что ты не робот

Выводить метку времени компиляции в Visual С++ исполняемый файл?

Как я могу вставить информацию о метке компиляции в исполняемый файл, который я создаю с помощью Visual С++ 2005? Я хочу, чтобы иметь возможность выводить что-то вроде этого при выполнении программы:

Эта сборка XXXX была скомпилирована в формате dd-mm-yy, hh: mm.

где дата и время отражают время создания проекта. Они не должны меняться при каждом последующем вызове программы, если она не перекомпилирована.

4b9b3361

Ответ 1

Хотя не ваш точный формат, DATE будет иметь формат Mmm dd yyyy, а TIME будет иметь формат hh: mm: ss. Вы можете создать такую ​​строку и использовать ее в любой процедуре печати, которая имеет смысл для вас:

const char *buildString = "This build XXXX was compiled at " __DATE__ ", " __TIME__ ".";

(Примечание по другому ответу: TIMESTAMP выводит только дату/время изменения исходного файла, а не дату и время сборки.)

Ответ 2

__DATE__ 
__TIME__

предопределены как часть стандартов для C99, поэтому они должны быть доступны вам. Они запускаются один раз с препроцессором.

Ответ 3

Ну... для Visual С++ существует встроенный символ __ImageBase. В частности:

EXTERN_C IMAGE_DOS_HEADER __ImageBase;

Вы можете проверить, что во время выполнения определить временную метку в заголовке PE:

const IMAGE_NT_HEADERS *nt_header= (const IMAGE_NT_HEADERS *)((char *)&__ImageBase + __ImageBase.e_lfanew);

И используйте nt_header->FileHeader.TimeDateStamp, чтобы получить отметку времени, которая находится в секундах от 1/1/1970.

Ответ 4

__TIME__ и __DATE__ могут работать, однако есть некоторые сложности.

Если вы помещаете эти определения в файл .h и включаете определения из нескольких файлов .c/.cpp, каждый файл будет иметь другую версию даты/времени, основанную на компиляции. Поэтому, если вы хотите использовать дату/время в двух разных местах, и они всегда должны совпадать, у вас проблемы. Если вы делаете инкрементную сборку, один из файлов может быть перестроен, а другой - нет, что снова приводит к отметкам времени, которые могут быть совершенно разными.

Несколько лучше использовать прототипы GetBuildTimeStamp() в файле .h и поместить макросы __TIME__ и __DATE__ в файл реализации (.c/.cpp). Таким образом, вы можете использовать метки времени в нескольких местах вашего кода, и они всегда будут совпадать. Однако вам нужно убедиться, что файл .c/.cpp перестраивается каждый раз, когда выполняется сборка. Если вы делаете чистые сборки, это решение может сработать для вас.

Если вы делаете инкрементные сборки, вам необходимо убедиться, что штамп сборки обновлен для каждой сборки. В Visual С++ вы можете сделать это с помощью шагов PreBuild - однако в этом случае я рекомендовал бы вместо использования __DATE__ и __TIME__ в скомпилированном файле .c/.cpp использовать текстовый файл, который читается на во время выполнения программы. Это ускоряет создание вашей сборки script для обновления временной метки (не требуется компиляция или привязка) и не требует, чтобы шаг PreBuild понял ваши флаги или параметры компилятора.

Ответ 5

Я думаю, предлагаемые решения для использования DATE, ВРЕМЕНИ или TIMESTAMP были бы достаточно хорошими. Я рекомендую задержать сенсорную программу для включения на этапе предварительной сборки, чтобы коснуться файла, в котором используется переменная препроцессора. Прикосновение к файлу гарантирует, что его временная метка новее, чем в момент последнего компиляции. Таким образом, дата и время в скомпилированном файле также изменяются при каждом восстановлении.

Ответ 6

Visual С++ также поддерживает __TIMESTAMP__, что почти то, что вам нужно. Это говорит о том, что жесткая часть о временных методах сборки поддерживает их актуальность, что означает компиляцию файла, в котором __TIMESTAMP__ используется для каждой перестройки. Не уверен, есть ли способ установить это в Visual С++, хотя.