Как говорит @ leo-liu-msft, второе решение работает, но работает не так, как ожидалось, как я объясню ниже.
Если {packagename} .props содержит это:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="CreateCompilationFileTimeTarget" BeforeTargets="Build">
<Exec Command="$(MSBuildThisFileDirectory)..\tools\CreateCompilationTimeFile.exe"/>
</Target>
</Project>
Предположим, что вы только что создали новый проект C ++ и включили файл compilationtime.h в один из ваших файлов .cpp:
#include "compilationtime.h"
Помните, что проект новый , и у вас нет compilationtime.h файловой струи, предполагается, что он будет создан до процесса сборки из-за {packagename} .props.
Если вы создадите свой проект C ++, вы получите C0183 Невозможно открыть включаемый файл: 'CompilationTime.h': такого файла или каталога нет Ошибка.
Если затем открыть папку проекта, файл compilationtime.h находится не там, где он должен быть.
Теперь прокомментируйте строку #include "compilationfile.h"
и скомпилируйте ее снова. Компилятор завершит работу без ошибок, и если вы проанализируете папку, файл будет там!
Теперь, когда ваш compilationfile.h уже существует, отредактируйте его и измените tm_year на 0, например:
#pragma once
static struct tm GetCompilationTime()
{
struct tm compilationTime = { 0 };
compilationTime.tm_year=0;
compilationTime.tm_mon=9;
compilationTime.tm_mday=15;
compilationTime.tm_hour=15;
compilationTime.tm_min=37;
compilationTime.tm_sec=41;
return compilationTime;
}
.. а затем в файле .cpp выведите год на консоль:
#include "pch.h"
#include <iostream>
#include "CompilationTime.h"
int main()
{
std::cout << GetCompilationTime().tm_year << std::endl;
}
Скомпилируйте и запустите программу. Программа выведет 0 , а не текущий год, но если вы откроете файл compilationtime.h , он будет изменен с текущим годом, поэтому компилятор будет вести себя так, как будто вместо BeforeTargets="Build"
мы настроили AfterTargets="Build"
.
Наконец-то я решил проблему, изменив BeforeTargets на PrepareForBuild следующим образом:
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="CreateCompilationFileTimeTarget" BeforeTargets="PrepareForBuild">
<Exec Command="$(MSBuildThisFileDirectory)..\tools\CreateCompilationTimeFile.exe"/>
</Target>
</Project>
и теперь он создает / обновляет файл compilationtime.h всегда перед сборкой, как я хотел.