2013-11-15 9 views
0

TLDR; devenv, похоже, создает зависимости от того, какой конфигуратор/платформа была выбрана последним в графическом интерфейсе, а не в том, что говорит/projectconfig. Идеи?vs2012 не передает/projectconfig в зависимости?


У меня есть визуальное решение Studio 2012, который строит отладки & релиз, win32 & x64. Она состоит из двух проектов

  • "общий" производит статическую библиотеку
  • "Foo" производит DLL, и связи с common.lib

Оба выхода проекта на $ (SolutionDir) $ (Конфигурация) _ $ (Платформа), например myTest/Release_Win32, поэтому я могу легко переключаться между конфигурациями.

Проект foo зависит от common, и когда я явно построить foo в полном GUI он правильно строит common первым, для какой конфигурации/платформ я сейчас ориентируюсь.

Однако, если я запускаю командную строку

devenv.exe myTest/myTest.sln /project foo /projectconfig "Release|x64" /build

Тогда это будет не потому, что он не может найти common.lib при связывании. Действительно, нет myTest/Release_x64/common.lib, но там myTest/Debug_Win32/common.lib. Я могу убедиться, что это вызвано этой командой devenv, она снова появляется после удаления всех каталогов.

Похоже, что devenv пытается построить common в качестве зависимости, но не смог указать projectconfig и вернуться к умолчанию Debug & Win32.

Я могу обойти это, создав вручную common, прежде чем пытаться построить foo, но я бы предпочел, чтобы это произошло автоматически. Кто-нибудь еще сталкивался с этим или имел обходное решение/решение?


Вот решение, которое демонстрирует проблему, и как я создал его:

http://beanalby.net/stackExchange/vsDepends.zip

  • создали "общий", как Static Lib с новым решением
  • создал "Foo" в консоли Приложение в этом решении
  • добавлено $ (OutDir) common.lib как дополнительная зависимость при компоновщике/вводе для всех конфигураций на foo
  • с пометкой "Foo" зависит от "общего"
  • вышел визуально студию, сэкономив проекты & решение

работает devenv myTest/myTest.sln /project foo /projectconfig "Release|x64" /build производит:

C:\Users\jason\Desktop>devenv myTest/myTest.sln /project foo /projectconfig "Release|x64" /build 

Microsoft (R) Microsoft Visual Studio 2012 Version 11.0.60610.1. 
Copyright (C) Microsoft Corp. All rights reserved. 
1>------ Build started: Project: common, Configuration: Debug Win32 ------ 
1>Build started 11/15/2013 13:15:22. 
1>PrepareForBuild: 
1> Creating directory "C:\Users\jason\Desktop\myTest\Debug\". 
1>InitializeBuildStatus: 
1> Creating "Debug\common.unsuccessfulbuild" because "AlwaysCreate" was specified. 
1>ClCompile: 
1> stdafx.cpp 
1>Lib: 
1> common.vcxproj -> C:\Users\jason\Desktop\myTest\Debug\common.lib 
1>FinalizeBuildStatus: 
1> Deleting file "Debug\common.unsuccessfulbuild". 
1> Touching "Debug\common.lastbuildstate". 
1> 
1>Build succeeded. 
1> 
1>Time Elapsed 00:00:00.52 
2>------ Build started: Project: foo, Configuration: Release x64 ------ 
2>Build started 11/15/2013 13:15:22. 
2>PrepareForBuild: 
2> Creating directory "C:\Users\jason\Desktop\myTest\x64\Release\". 
2>InitializeBuildStatus: 
2> Creating "x64\Release\foo.unsuccessfulbuild" because "AlwaysCreate" was specified. 
2>ClCompile: 
2> stdafx.cpp 
2> foo.cpp 
2>LINK : fatal error LNK1181: cannot open input file 'C:\Users\jason\Desktop\myTest\x64\Release\comm 
on.lib' 
2> 
2>Build FAILED. 
2> 
2>Time Elapsed 00:00:00.56 
========== Build: 1 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

Если открыть Visual Studio, изменение платформы/конфигурации на что-нибудь еще, и выйти (он не будет просить сохранить), то common будет строить как платформу THAT/config.

Это происходит как с VS2012 x64 Cross Tools Command Prompt, так и с VS2012 x86 Native Tools Command Prompt.

+1

Здание с devenv.exe устарело некогда, вместо этого используйте MSBuild.exe. –

ответ

0

Подтверждая комментарий Hans Passant, The docs for devenv говорят:

Note 
For build-related tasks, it is now recommended that you use MSBuild 
instead of devenv. For more information, see MSBuild Command-Line Reference. 

Использование MSBuild вместо этого как

MSBuild.exe myTest/myTest.sln /t:foo /p:Configuration=Release;Platform=x64 

позволяет ему получить платформу & конфигурации правильно. Этот Q/A будет служить предупреждением тем, кто все еще использует devenv в командной строке. Repent & переключатель!