2011-12-26 10 views
10

У меня есть проект на C++ (какое-то консольное 32-разрядное приложение), разработанное в VS2010, которое прекрасно работает на моем ПК (32-разрядная версия Windows 7) , На моем ПК установлен Microsoft SDK 7.0A, который, я думаю, поставляется в комплекте с VS2010.
Я пытаюсь построить проект на сервере сборки, на котором нет установленной Visual Studio - там присутствует только Microsoft SDK 7.1.
я пытаюсь построить проект с помощью MSBuild (это будет в конечном итоге стать задачей для бегуна Teamcity в), и на сервере сборки я получаю следующие ошибки (подробный журнал предусмотрен):Проект C++ на ПК с Windows SDK 7.1, но без VS2010

Project "E:\win\core.sln" on node 1 (default targets). 
ValidateSolutionConfiguration: 
    Building solution configuration "Debug|Win32". 
Project "E:\win\core.sln" (1) is building "E:\win\core_unittests.vcxproj" (2) on node 1 (default targets). 
Project "E:\win\core_unittests.vcxproj" (2) is building "E:\cpptest\win\cpptest.vcxproj" (3) on node 1 (default targets). 
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.Targets(847,9): warning MSB3644: The reference assemblies for framework ".NETFramework,Version=v4.0" were not found. To resolve this, install the SDK or Targeting Pack for this framework version or retarget your application to a version of the framework for which you have the SDK or Targeting Pack installed. Note that assemblies will be resolved from the Global Assembly Cache (GAC) and will be used in place of reference assemblies. Therefore your assembly may not be correctly targeted for the framework you intend. [E:\cpptest\win\cpptest.vcxproj] 
C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets(297,5): warning MSB8003: Could not find WindowsSDKDir variable from the registry. TargetFrameworkVersion or PlatformToolset may be set to an invalid version number. [E:\win\cpptest.vcxproj] 
InitializeBuildStatus: 
    Touching "E:\cpptest\win\..\..\..\out\Debug\cpptest\cpptest.unsuccessfulbuild". 
ClCompile: 
    C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\CL.exe /c /ZI /nologo /W3 /WX- /Od /Oy- /D WIN32 /D _DEBUG /D _LIB /D _UNICODE /D UNICODE /Gm /EHsc /RTC1 /MTd /GS /fp:precise /Zc:wchar_t /Zc:forScope /Fo"E:\cpptest\win\..\..\..\out\Debug\cpptest\\" /Fd"E:\cpptest\win\..\..\..\out\Debug\cpptest\vc100.pdb" /Gd /TP /analyze- /errorReport:queue ../missing.cpp 
    missing.cpp 
e:\cpptest\missing.cpp(36): fatal error C1083: Cannot open include file: 'windows.h': No such file or directory [E:\cpptest\win\cpptest.vcxproj] 

I предположим, что проблема связана с неспособностью msbuild найти Microsoft SDK, который установлен в "E:\Program Files\Microsoft SDKs\Windows\v7.1".

Есть несколько советов, как справиться с этой проблемой можно найти в Интернете:

  1. Копировать часть реестра под HKLM\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1 к HKCU (см WindowsSdkDir is not set correctly in Visual Studio 2008?). Я не пробовал это обходное решение, потому что, поскольку он выглядит слишком уродливым, и процесс сборки будет работать с учетными данными SYSTEM-account.
  2. Передача WindowsSDKDir в качестве дополнительных параметров для MSBuild (как предложено в TeamCity and MSBuild Quirks #1).
  3. Тонкая настройка VCProjectEngine.dll.config.xml как предложено в answer по Include Search Paths in TeamCity build Configurations (таких файлов на ПК с Windows SDK не найдено).
  4. Измените набор инструментов платформы в свойствах проекта, как предлагается в the answer, до WindowsSdkDir is not set correctly in Visual Studio 2010 (я сомневаюсь, что это поможет, поскольку на моем ПК не установлен Windows SDK 7.1).

На самом деле при компиляции с CL.EXE все идет хорошо (потому что у меня INCLUDE и LIB переменные, определенные), поэтому было бы обходной путь, чтобы заставить MSBuild использовать/передать переменные окружения ...

Есть похожие вопросы:

Во всяком случае кто-нибудь удалось с построением Visual C++ 2010 проектов на ПК с Windows SDK установлен?

ответ

11

Я, наконец, нашел какое-то работоспособное и содержательное решение проблемы - внутри "Can we build *.vcxproj(c++ project) using MSBuild 4.0 without installing the Visual Studio 2010?".
Вкратце: я должен явно указать набор инструментов платформы при создании решения на ПК без VS2010. Команда будет выглядеть следующим образом:

msbuild /p:PlatformToolset=Windows7.1SDK core.sln 

Вы, вероятно, нужно идти так же, если ваш проект имеет v100 или v90, указанному в качестве платформы Toolset.

И дополнительный намек для энтузиастов TeamCity, работающих на сервере на ПК с установленным одиночным Windows SDK.
Вместо изменения всех шагов сборки достаточно указать набор инструментов платформы в свойствах агента. Для этого добавьте следующую строку в ?:\TeamCity\buildAgent\conf\buildAgent.properties:

system.PlatformToolset=Windows7.1SDK 

Днем здание! :)

+0

Привет, можете ли вы лучше указать, как вы запускаете Visual Studio 2010 C++ проект на сервере сборки с агентом городской команды? Использование этапа сборки решения Visual Studio 2010 не работает, потому что кажется stht MSBuild зависит от отсутствующей DLL-библиотеки mspdb100.dll – Stefano

+0

@Stefano, обычно правильным решением в вашем случае является добавление каталога 'mspdb100.dll' в'% PATH% '. – AntonK

1

Также вы можете добавить этот узел & значение в реестр (правильно с вашей установкой dirs & выиграть 32/64 версию).

--- начать REG-файл ---

Windows Registry Editor Version 5.00 

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\10.0\Setup\VS] 
"ProductDir"="C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\" 

--- Конец REG-файл ---

из MSBuild сценария % ProgramFiles (x86)% \ MSBuild \ Microsoft .Cpp \ v4.0 \ Платформы \ Win32 \ PlatformToolsets \ Windows7.1SDK \ Microsoft.Cpp.Win32.Windows7.1SDK.props "поиск VSInstallDir.