VS 2012 Build Abhängigkeiten
-
Hey und guten Tag,
ich habe ein kurioses Problem:
Ich habe eine Solution mit zwei Projekten.
1. Eine Library
2. Eine exe welche die Library benutzt.Beide haben als ouptut Pfad: '(SolutionDir)bin\\(Platform)\(Configuration)\\' Zusätzlich hat die exe als lib Pfad: '(SolutionDir)bin\(Platform)\\(Configuration)\'
Wenn ich nun manuell 1. und dann 2. builde geht alles gut. Wenn ich jedoch die komplette solution builden lasse, funktioniert es nicht mehr?
Folgenden ouput sehe ich:
`1> Creating library C:\Develop\solution\bin\x64\Debug\MyLib.lib and object C:\Develop\solution\bin\x64\Debug\MyLib.exp
1> MyLib.vcxproj -> C:\Develop\solution\bin\x64\Debug\MyLib.dll
1> Volume in Laufwerk C:
1> Volumeseriennummer: 7E06-92C1
1>
1> Verzeichnis von C:\Develop\solution\bin\x64\Debug
1>
1> 15.08.2013 11:07 <DIR> .
1> 15.08.2013 11:07 <DIR> ..
1> 15.08.2013 11:07 41.984 MyLib.dll
1> 15.08.2013 11:07 999 MyLib.exp
1> 15.08.2013 11:07 238.132 MyLib.ilk
1> 15.08.2013 11:07 2.266 MyLib.lib
1> 15.08.2013 11:07 363.520 MyLib.pdb
1> 5 Datei(en), 646.901 Bytes
1> 2 Verzeichnis(se), 175.886.725.120 Bytes frei
und dann als zweites:
2>LINK : fatal error LNK1104: cannot open file 'MyLib.lib'
`
Jetzt wird es richtig merkwürdig: Wenn ich nach C:\Develop\solution\bin\x64\Debug wechsle ist das Verzeichnis leer
. Obwohl ich im Postbuild ja ein den Befehl 'dir (SolutionDir)bin\\(Platform)\$(Configuration)\' eingebaut habe und er mir die Dateien ja auch anzeigt, wie man im output sieht
.
Ich bin verwirrt?!?! Vielleicht hat ja jemand nen Plan oder ne Idee was falsch läuft.
-
*snip*
-
Was ist damit gemeint?
-
Lade mal irgfend wohin Deine Projektdatei hoch. Scheinbar ist irgendein Befehl durch DIR ersetzzt worden.
-
Ok hab die Ursache gefunden:
Rebuild führt (wie auch beabsichtigt) ein Clean durch. Das Problem dabei: Dieses Clean wird für jedes Projekt in der Buildabfolge einzeln aufgerufen. Da alle das gleiche Buildverzeichnis benutzen, werden die libs, die vorher erstellt worden sind, sofort wieder gelöscht. Wenn das Projekt, welches gerade mit bauen dran ist, die Lib braucht
gibts nen Linkererror.
Die Lösung ist also, anstatt die Solution zu rebuilden, einfach nen Clean aufrufen und dann nur noch Build Solution.
Problem war also, dass das Build Verzeichnis bei allen Subprojekten das gleiche ist, was es aber auch sein soll ^^
Grüße
Nico
-
Was meinst du mit "Buildverzeichnis"?
Wenn nur das Output-Verzeichnis das selbe ist, dann dürfen sich Projekte nicht auf diese Art in die Quere kommen.
-
Für jedes Projekt in meiner Solution ist das
Output Dir =$(SolutionDir)bin\$(Platform)\$(Configuration)\
Working Dir =
$(SolutionDir)bin\$(Platform)\$(Configuration)\
Intermediate Dir =
$(SolutionDir)build\$(Platform)\$(Configuration)\
Wenn ich nur Clean aufrufe sind beide Ordner (bis auf *.log) leer.
Obwohl bei 'Extensions to Delete on Clean' nur folgende aufgelistet sind:
*.cdf;*.cache;*.obj;*.ilk;*.resources;*.tlb;*.tli;*.tlh;*.tmp;*.rsp;*.pgc;*.pgd;*.meta;*.tlog;*.manifest;*.res;*.pch;*.exp;*.idb;*.rep;*.xdc;*.pdb;*_manifest.rc;*.bsc;*.sbr;*.xml;*.metagen;*.bi
-
Das sollte helfen
Intermediate Dir =$(SolutionDir)build\$(ProjectName)\$(Platform)\$(Configuration)\
Selbes Intermediate Dir für verschiedene Projekte funktioniert auf jeden Fall nicht.
-
Super
Vielen vielen Dank!!!
Intermediate angepasst und Rebuild Solution geht nun auch endlichTop!
-
BTW: der üblichere Name für das Intermediate-Dir wäre "obj" -- nicht "build". "build" würde man eher für ein Verzeichnis verwenden wo Build-Skripte drinnen liegen. Bzw. im Visual-Studio Fall eben die .vc(x)proj und .sln Files.
Obwohl es bei Visual-Studio eher schlau ist die Default-Location beizubehalten, da man sonst hundert Pfade umstellen muss und bei "Add File..." andauernd in das Source-Verzeichnis wechseln muss, weil die Dumpfbacke VS es nicht checkt dass die Project-Files woanders liegen als die Source-Files.
(Und bei C# Projekten is dann sowieso ganz schluss-mit-lustig, da wird es Mega-Nervig wenn man die Project-Files nicht im "top-level" Source Verzeichnis liegen hat.)