Выходная метка времени компиляции в исполняемом файле Visual C ++? - PullRequest
16 голосов
/ 25 августа 2008

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

Эта сборка XXXX была скомпилирована с дд-мм-гг, чч: мм.

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

Ответы [ 6 ]

19 голосов
/ 25 августа 2008

Хотя это не ваш точный формат, ДАТА будет иметь формат Mmm dd гггг, а TIME будет иметь формат чч: мм: сс. Вы можете создать такую ​​строку и использовать ее в любой процедуре печати, которая имеет для вас смысл:

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

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

7 голосов
/ 25 августа 2008
__DATE__ 
__TIME__

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

5 голосов
/ 25 августа 2008

Ну ... для Visual C ++ есть встроенный символ с именем __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 голосов
/ 25 августа 2008

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

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

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

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

1 голос
/ 25 августа 2008

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

0 голосов
/ 25 августа 2008

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

...