Интеграция файлов протоколов HTTP протокола.proto в Visual C++ 2010

Я добавил настраиваемый шаг сборки к моим проектам проекта Visual Studio, который генерирует файлы goob protobuf.h/.cc из входных файлов.proto. Но мне было интересно, можно ли начать компиляцию только в том случае, если содержимое прото файлов изменилось?

Есть ли способ сказать VisualStudio с пользовательского этапа сборки именно так? Каков оптимальный способ интеграции прото файлов в решение для визуальной сборки студии?

На данный момент при каждой сборке обновляется файл.proto, который затем также обновляет отметку времени выходных файлов.h/.cc..., которая затем выдает перекомпиляцию из всех зависимых от нее. Есть ли лучший способ обойти его, все еще строя их непосредственно из визуальной студии?

Ответ 1

Может быть, это помогает. Особенно взгляните на должность Игоря Завойчинского:

Решение этой неприятной проблемы на самом деле просто: в разделах выходов следует указать полный путь (пути). Это явно не указано нигде, но без этой проверки не удается найти файлы и, следовательно, предполагает, что они не существуют. Например, для протобафферов компиляция разделов выходов будет выглядеть так:

$ (InputDir)\$ (InputName).pb.cc; $ (InputDir)\$ (InputName).pb.h

и (возможно?) kmote00:

... Итог: мне просто нужно было убедиться, что моя запись "Выходы" точно соответствует значению по умолчанию в определенном (определяемом пользователем) свойстве "OutputFile". (К счастью, это также устранило необходимость в двухпроходной сборке, которая была еще одной досадой, с которой я раньше мирился).

Ответ 2

Следуйте этим подробным инструкциям, чтобы указать Custom Build Tool.

Учитывая, что ваш прото файл находится вместе с файлами.h/.cpp в стандартной конфигурации проекта, вот значения, которые нужно вставить в Custom Build Tool:

Command Line: 
path\to\protoc --proto_path=$(ProjectDir) --cpp_out=$(ProjectDir) %(FullPath)
Outputs: 
$(ProjectDir)%(Filename).pb.h;$(ProjectDir)%(Filename).pb.cc

Обратите внимание на использование макроса метаданных элемента, который заменил некоторые устаревшие макросы (например, $ (InputDir) и $ (InputName)).

Теперь компилятор протоколов протоколов будет запущен только тогда, когда входной файл (т.е.% (FullPath)) является более новым, чем "Выходы".