Включить stdafx.h из других проектов

#c #visual-studio-2008

#c #visual-studio-2008

Вопрос:

Внутри решения Visual Studio у меня есть два vcproj, один вызывается kernellib.vcproj , другой вызывается kernerlibtest.vcproj . Как вы можете догадаться, последний является проектом модульного тестирования для первого.

Теперь kernellib.vcproj используется предварительно скомпилированный заголовок, и все медленные WINAPI includes находятся в stdafx.h . Это делается для того, чтобы убедиться, что ядро может быстро компилироваться.

Теперь, поскольку kernerlibtest.vcproj также используется тот же набор включений, я также хочу выполнить этот трюк с ускорением, чтобы kernerlibtest.vcproj как я могу настроить свой vcproj и файл решения для этого?

Комментарии:

1. Вы будете бороться с C2859, жалуясь на несоответствие между .pch и базой данных программы. Я не думаю, что вы можете заставить это работать.

Ответ №1:

Включить его здесь : Project -> Properties -> Configuration Properties-> C/C -> PreCompiled Headers . Измените параметр «Не использовать предварительно скомпилированные заголовки» на «Использовать /Yu». (Это то, как это делается в vs2010, надеюсь, должно быть так же и в vs2008)

Комментарии:

1. но это будет относиться к stdafx.h in kernerlibtest.vcproj вместо stdafx.h in kernerlib.vcproj , я прав?

2. Извините, я неправильно понял ваш вопрос изначально. Я думаю, что stdafx.h будет пересчитан для вашего проекта. Я работаю над большим решением с несколькими проектами, и первое сообщение о сборке src, которое я вижу, — «ClCompile: stdafx.cpp «; Если вы добавили файлы kernellib .h в проект, я думаю, они должны были быть включены в pch.

3. Эй, я думаю, вы можете попробовать несколько / Yc , смотрите: msdn.microsoft.com/en-us/library/z0atkd6c(v=vs.80).aspx . Я думаю, вы можете присвоить другое имя предварительно скомпилированному заголовку kernerlib, а затем включить multiple / Yc, чтобы избежать конфликта, как указано в документации.

Ответ №2:

Есть много способов заставить это работать. Вот мой совет:

  • «stdafx.h» (или как бы вы ни называли свой предварительно скомпилированный заголовок) должен быть внутренним заголовком для каждого модуля.
  • Вы должны включать только редко изменяющиеся заголовки в stdafx.h, материал, который не сильно меняется.
  • Вы должны относиться к этому строго как к оптимизации.
  • Включать только stdafx.h из ваших файлов .c / cpp, а не какие-либо общедоступные заголовки.
  • Вы все равно должны включать заголовки stdlib / winapi в свои общедоступные заголовки, если ваши заголовки зависят от определений, таких как HWND. Это не замедлит компиляцию вашей библиотеки, потому что вы сначала включаете предварительно скомпилированный заголовок.
  • В stdafx.h для kernerlibtest вы даже можете включить kernerlib.h (общедоступный заголовок для зависимости). Вы ничего не получите, если kernerlib.h часто изменяется.
    • Это полезно, если вы размещаете большую стороннюю библиотеку внутри своего рабочего дерева.