Получение необъяснимых ошибок MSBuild из-за / d1clr: nostdlib - PullRequest
0 голосов
/ 13 сентября 2011

Все еще не слишком разбираясь в .NET, мне поручено преобразовать довольно большое решение .NET из VS2008 в VS2010. Частично это набор проектов C ++ (/clr), которые я перенес на VS2010. Я установил их целевую среду на 2.0, потому что они используются в проектах, которые сейчас не нужно конвертировать.

После долгих хлопот я нахожусь в точке, где целое решение собирается в VS2010, но для автоматизированных сборок и тестов мне тоже нужно, чтобы программа была построена с использованием MSBuild, и это не помогает. Проблема в том, что где-то ключ /d1clr:nostdlib добавляется к командной строке компилятора, что приводит к неприятному сообщению об ошибке:
error MSB6001: Invalid command line switch for "CL.exe". Illegal characters in path. [C:\blah\foo.vcxproj]
Когда я смотрю на командную строку, генерируемую MSBuild, я вижу только одну странную вещь: она заканчивается указанным переключателем: ...foo.cpp bar.cpp baz.cpp /d1clr:nostdlib

  1. Я полагаю, что этот переключатель не работает, потому что старый компилятор, вызванный для .NET 2.0, не знает, как с этим справиться?
  2. Где бы я начал искать, где этот переключатель добавляется? Я не вижу его на странице свойств C / C ++ / Command Line на странице свойств проекта.

1 Ответ

3 голосов
/ 13 сентября 2011

Вы уверены, что вам нужно установить целевой фреймворк на 2.0?

Не может ли проект 2.0 ссылаться на проект 4.0 (или каким-либо другим образом преобразованный проект)?

При просмотре файлов MSBuild команда, кажется, добавлена ​​из-за этих строк в Microsoft.CppBuild.targets (на моем компьютере, расположенном в C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0:

  <ClCompile Condition="'@(ClCompile)' != '' and '$(CLRSupport)' != 'false' and '$(CLRSupport)' != ''">
    <AdditionalUsingDirectories>$(TargetFrameworkDirectory);%(ClCompile.AdditionalUsingDirectories)</AdditionalUsingDirectories>
    <AdditionalOptions Condition="('$(TargetFrameworkVersion)' == 'v3.5' or '$(TargetFrameworkVersion)' == 'v3.0' or '$(TargetFrameworkVersion)' == 'v2.0')">/d1clr:nostdlib %(ClCompile.AdditionalOptions)</AdditionalOptions>
    <AdditionalOptions Condition="'$(TargetFrameworkVersion)' == 'v4.0'">/clr:nostdlib %(ClCompile.AdditionalOptions)</AdditionalOptions>
  </ClCompile>

Другими словами, он добавляется просто потому, что вы устанавливаете целевую версию фреймворка на значение, отличное от 4.0. (Если бы он был установлен на 4.0, он бы вместо этого добавил флаг /clr:nostdlib)

Я понятия не имею, почему это не сработает при прямом вызове через MSBuild. Возможно, он использует другую версию компилятора (PATH или какая-то другая переменная окружения установлена ​​неправильно, возможно?)

При сборке через Visual Studio он также вызывает MSBuild, поэтому на самом деле не должно иметь никакого значения, что вы вызываете MSBuild «напрямую», если какая-то часть среды не настроена по-другому. (или вы вызываете MSBuild с неправильными флагами)

Конечно, в этих файлах MSBuild нет ничего «волшебного», так что вы можете изменить их или отредактировать свой проект, ссылаясь на отдельные их версии (которые вы изменили, чтобы не вставлять флаг). Это, если вы игнорируете беспорядок XML, просто система сборки общего назначения. У него нет «встроенного» понимания проектов VC ++, кроме того, что указано в этих файлах XML.

...