Ответ, данный sblom, является правильным, но он не объясняет причину.
Для каждого правила сборки (пользовательского или собственного) система сборки VS должна знать полный список входов и выходов, чтобыон может решить, какую часть проекта нужно собрать.
Ваше правило сборки объявляет сгенерированный файл .cpp как выходной, поэтому VS знает об этом и автоматически создаст этот файл для вас.Поскольку вы не указали файл заголовка, VS не знает об этом, поэтому любые исходные файлы, содержащие этот заголовок, не будут знать, где его получить, и не смогут его построить.Чтобы обойти сборку, работающую в этой ситуации, нужно добавить каталог, в котором находится этот .h файл, к вашему пути включения, и тогда будет работать #include этого файла.По сути, вы позволяете VS узнать об этом файле по-другому.
И наоборот, если вы измените правило сборки, объявляя файл заголовка как выходной, то включающие его исходные файлы будут знать, где получить этот файл.from, но теперь VS не знает о вашем файле .cpp, поэтому он не будет его собирать.Обходной путь для этого случая заключается в явном добавлении сгенерированного файла .cpp в ваш проект в качестве исходного файла.Как и в приведенном выше случае, вы используете хитрость, чтобы заставить систему сборки распознавать сгенерированный файл.
Но хотя приведенные выше обходные пути помогут вам начать работу, они не являются лучшим решением, поскольку они просто компенсируют VSне зная о файле.Лучший способ решить эту проблему - объявить файлы .cpp и .h как выходные данные в вашем правиле, разделив их точкой с запятой.Это позволит VS применять правильное поведение к обоим файлам.