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
.
Здание с devenv.exe устарело некогда, вместо этого используйте MSBuild.exe. –