2015-10-15 13 views
7

Sto cercando di ottenere una versione x64 pura in esecuzione per una build complessa con molte soluzioni (alcune per CI, alcune per sviluppatori) e centinaia di progetto ed hanno eseguito in "errore MSB8013: Questo progetto non contiene la configurazione e la combinazione della piattaforma di debug | Win32"x64 build: errore MSB8013: questo progetto non contiene la combinazione di configurazione e piattaforma di Debug | Win32

ho ridotto a una semplice configurazione:

  • Solution A contiene Progetto X & Progetto Y. Progetto X ha un progetto riferimento al progetto Y.
  • Soluzione B contiene anche contiene Progetto X.

Nessuno dei progetti o soluzioni contengono una piattaforma Win32 - è stato cancellato.

Quando costruisco soluzione B (x64), ricevo

errore MSB8013: Questo progetto non contiene la configurazione e Piattaforma combinazione di Debug | Win32

Il messaggio di errore a volte contiene informazioni aggiuntive:

Questo errore può apparire anche se qualche altro progetto sta tentando di seguire uno riferimento progetto-progetto a questo progetto, questo progetto è stato scaricato o non è incluso nella soluzione e il progetto di riferimento non viene creato utilizzando la stessa o una configurazione equivalente o piattaforma.

Il problema è il progetto di riferimento fa "costruire utilizzando lo stesso o di una configurazione o di una piattaforma equivalente."

Osservando la diagnostica di msbuild, il progetto Y viene costruito perché il progetto X contiene un riferimento al progetto. Ma le proprietà di configurazione e la piattaforma vengono eliminati poco prima di progetto Y è costruito:

1>Task "MSBuild" (TaskId:28) 
1> Removing Properties: (TaskId:28) 
1> Configuration (TaskId:28) 
1> Platform (TaskId:28) 

Come un risultato Microsoft.Cpp.Default.props calci e imposta questi per Debug | Win32:

1>Task "Message" (TaskId:11) 
1> Configuration=Debug (TaskId:11) 
1>Done executing task "Message". (TaskId:11) 
1>Task "Message" (TaskId:12) 
1> Platform=Win32 (TaskId:12) 
1>Done executing task "Message". (TaskId:12) 

Come posso evitare questo e rendere msbuild passare la piattaforma di configurazione scelta &?

(ho capito l'ultima soluzione per utilizzare NuGet per gestire le dipendenze dei pacchetti, ma che non è fattibile a breve termine)

risposta

0

Una correzione è a portata di mano modificare il.vcxproj file per definire la piattaforma predefinita:

  1. Aprire il file vcxproj in un editor di testo
  2. Aggiungi questa riga nel PropertyGroup "Globals":

    < piattaforma condizione = " '$ (Platform) '== ''" > x64 </Piattaforma >

3

ho potuto risolvere una simile I includendo tutti i progetti di riferimento nella soluzione, in questo caso includendo il progetto Y nella soluzione B.

0

Sembra che ci sia un errore nel file Microsoft.CppBuild.targets. Su alcune macchine vedo due di questi file: uno in C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.CppBuild.targets con dimensioni ~ 120KB e C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.CppBuild.targets con dimensioni 77KB. Il secondo è bacato e ottiene un valore errato $ (Configuration) | $ (Platform) che produce un errore citato. Questo problema è probabilmente collegato direttamente a this topic, poiché VCTargetsPath nei miei progetti indicava una directory Microsoft.CppBuild.targets errata (77 KB) (utilizzo VS2015 quindi dovrebbe utilizzare quella della directory V140). Ho trovato due soluzioni: 1) sostituire il file buggy o 2) modificare il registro HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\MSBuild\ToolsVersions\14.0\14.0\VCTargetsPath10 per puntare al file giusto.

0

Trovo difficile vedere quello che stai cercando di ottenere attraverso questo. Vuoi sempre costruire X AND Y? Anche nella soluzione che non ha alcun riferimento a Y? Sarebbe abbastanza illogico per me. Tuttavia, posso offrirti alcune soluzioni per risolvere/sopprimere questo problema, in base a ciò che desideri.

Se si vuole costruire X & Y con A e X con B

In Soluzione A, impostare l'altro progetto come una dipendenza accumulo, invece che fare riferimento progetto Y in Project X. Non puoi impostarlo finché si riferisce all'altro progetto (rimuovo sempre il riferimento nel file .vcxproj, si trova da qualche parte nella parte inferiore del progetto), ma una volta rimosso il riferimento al progetto interno, puoi avere la soluzione riferimento ad esso e quindi dovrebbe funzionare bene.

Quando si crea Soluzione A con MSBuild, sarà costruire X e Y, mentre la costruzione di soluzione B con MSBuild

Else

Se si vuole costruire X & Y sia con soluzione

Ci scusiamo, ma al momento non è possibile in MSBuild. Consiglierei di aggiungere il progetto Y alla soluzione e di riferirlo, ma poi, perché dovresti? Hai già un progetto che li include entrambi e, se desideri output diversi, puoi facilmente configurare diverse configurazioni.