Как использовать внешнюю систему сборки для проекта Visual C++ 2013?
Можно ли использовать external build system
для VC++ 2013? Я хочу, чтобы Visual Studio ничего не делал, кроме сборки, вызывая мои инструменты сборки.
Я думаю о чем-то вроде этого:
- Положите все команды сборки в пакетном режиме.
- Вызовите пакет сборки на уровне проекта, щелкнув правой кнопкой мыши по проекту и выбрав сборку.
Вызовите пакет сборки на уровне решения, щелкнув правой кнопкой мыши по решению и выбрав сборку.
Есть ли пошаговое руководство? Я искал много, но не повезло.
ДОБАВИТЬ 1 - Некоторый прогресс...
После краткого прочтения о MSBuild
процесс, я попробовал как ниже.
Во-первых, я редактирую *.vcxproj
файл проекта. Я меняю DefaultTargets
от Build
в MyTarget
,
<Project DefaultTargets="MyTarget" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
Затем я добавляю новую цель с именем MyTarget
:
<Target Name="MyTarget">
<Message Text="Hello, Bitch!" />
</Target>
Я надеюсь, что это может обойти встроенный процесс VS2013 и выполнять только мою собственную партию.
Хорошо работает в командной строке:
Но в Visual Studio, когда я щелкаю правой кнопкой мыши по проекту и выбираю build
Команда, это дает мне много ошибок ссылок.
Как избежать этих ошибок ссылок? Поскольку мой пакет может позаботиться обо всем процессе сборки, мне не нужна Visual Studio, чтобы сделать ссылку для меня.
ДОБАВИТЬ 2
Кажется, эти ошибки ссылки появляются, потому что я включаю *.c
файлы с ClCompile
пометить как ниже.
<ItemGroup>
<ClCompile Include="z:\MyProject1\source1.c" />
<ItemGroup>
Поскольку я не хочу, чтобы VS2013 вызывал компилятор, я изменяю его на <ClInclude>
тег, ошибки ссылок исчезли, но разрешение символов не работает... Кажется, мне не следует менять тег.
ДОБАВИТЬ 3
Вот еще один способ компиляции без ссылок.
Возможно ли для Visual Studio C++ компилировать объекты без ссылок
Кажется, у него нет проблемы разрешения символа. Но я все еще не могу вызвать внешнюю партию, нажав build/rebuild/clean
,
2 ответа
Возможно, вы захотите заглянуть в проекты make-файлов Visual Studio (в категории шаблонов проектов Visual C++/General).
Вы можете указать, какие команды выполнять для каждого типа сборки (очистка, сборка, перестройка). Команда может вызвать make, запустить пакетный файл или вызвать другой инструмент сборки. Он просто выполняет команду. Команды могут содержать различные макросы, которые предоставляет VS (аналогично переменным среды), поэтому команда может быть параметризована для таких вещей, как создание целевого каталога на основе решения или имени или типа проекта (отладка или выпуск).
(В ответе Майкла Барра указывалось на лучшее направление, то есть на лучший шаблон проекта VC++. Вы можете объединить мой ответ и его.)
Наконец-то я решил эту проблему!
Уловка так называемая target overriding
, Элементы контекстного меню Visual Studio Build\Rebuild\Clean
соответствуют целям MSBuild с именем Build\Rebuild\Clean
соответственно. Нам просто нужно переопределить их в *.vcxproj
файл.
Такие как это:
ПОМНИТЕ, что:
Последняя цель, которую видит MSBuild, это та, которая используется - вот почему мы помещаем в конец существующего файла *.vcxproj.
И в override.proj
Делай, что хочешь, как показано ниже:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="Build">
<Message Text="Build override!" />
<Exec Command="kickass.bat" />
</Target>
</Project>
Следующие 2 ссылки являются хорошими ссылками:
Обратите внимание, что:
Первая ссылка берет в качестве примера проект CSharp, но ТАКЖЕ работает с проектом VC++.
2-я ссылка не работает для проекта VC++, но рациональная аналогична. Если вы не включили
Microsoft.Cpp.targets
, вы увидите следующую ошибку при загрузке проекта:
ДОБАВИТЬ 1
Как я и пытался, нам не нужен другой overrride.proj
файл. Мы можем просто поставить конкретную цель в конце *.vcxprj
файл. Такие как ниже:
ДОБАВИТЬ 2
С target overriding
упомянутый выше, я могу запустить свой индивидуальный bat
файл с project's
Команды Build/Rebuild/Clean. Но я заметил, что когда я бегу solution's
Команды Build/Rebuild/Clean, я думаю, что это просто следование какой-то project dependency order
построить каждый проект соответственно, что не совсем эквивалентно тому, что я хочу для overall build
по моему сценарию.
Мой текущий обходной путь заключается в создании dummy project
и использовать его, чтобы вызвать партию для моего overall
строить.