2013-01-16 9 views
5

Ich habe ein größeres C++ - Projekt mit Source-Dateien in mehreren Ordnern organisiert (auf dem Dateisystem).VisualStudio-Projekt mit mehreren Quelldateien mit demselben Namen?

In zwei dieser Ordner habe ich Dateien mit dem gleichen Namen. z.B.

\MyProject\foo\Blurp.cpp 
\MyProject\foo\File.cpp 
\MyProject\bar\File.cpp 
\MyProject\bar\Knoll.cpp 

das Projekt ist Cross-Plattform, und ich verwende autoconf auf Linux und OSX, haben aber MSVC auf W32 (aufgrund einiger 3rd-Party-C++ Bibliotheken i auf W32 verwenden und die C++ Binärschnittstelle Inkompatibilitäten über Compiler) zu verwenden, Auf der MSVC-Seite ist das Projekt in mehrere "Filter" (diese virtuellen Ordner) organisiert (mit Namen, die ungefähr den Verzeichnissen entsprechen, in denen die Dateien gespeichert sind), so dass ich sie unterscheiden kann.

jetzt das Problem ist, wenn ich das Projekt erstellen, MSVC setzt die Objektdateien in einem einzelnen flachen Diretory, und ich am Ende mit:

\MyProject\Release\Blurp.obj 
\MyProject\Release\File.obj 
\MyProject\Release\Knoll.obj 

wie man sehen kann, gibt es nur eine File.obj, so ein binäres Objekt fehlt. Offensichtlich beschwert sich der Linker, da er Klassen/Funktionen/... nicht finden kann, die in dieser fehlenden Objektdatei definiert sind.

Gibt es eine Möglichkeit, MSVC anzuweisen, Objektdateien mit einem eindeutigen Namen zu erstellen, abhängig von den Verzeichnissen (oder Filtern), in denen diese Dateien gespeichert sind?

i vorstellen, so etwas wie:

\MyProject\Release\foo\Blurp.obj 
\MyProject\Release\foo\File.obj 
\MyProject\Release\bar\File.obj 
\MyProject\Release\bar\Knoll.obj 

oder

\MyProject\Release\foo-Blurp.obj 
... 

oder was auch immer. alle anderen Build-Systeme, die ich kenne (CMake, Autotools), können mit mehreren Dateien gleichen Namens umgehen.

Diese Frage ist ähnlich wie 3729515, aber ich bin derzeit auf VS2008 stecken. (die vorgeschlagene Lösung für VS2008 - das Objektverzeichnis für jede fragliche Datei zu setzen - ist etwas, das theoretisch funktioniert, aber das ich aus praktischen Gründen vermeiden möchte)

Antwort

6

Sie können eine Datei setzen spezifische Projekteinstellung für eine (oder beide) der Dateien, die Konflikte und die „Object File Name“ Eigenschaft auf:

$(InputDir)\$(IntDir)\ 

einfach mit der rechten Maustaste auf den Dateinamen statt dem Projektnamen die Eigenschaft für diese Option setzen nur Datei.

Zum Beispiel, wenn Sie das tun, für \MyProject\foo\File.cpp dann die Objektdatei für die Quelldatei \MyProject\foo\Release\File.obj gehen, damit es nicht für \MyProject\bar\File.cpp mit der Objektdatei in Konflikt geraten.

Die Nachteile sind, dass es Ihren Source-Tree mit Compiler-Outputs überladen kann (aber hoffentlich gibt es nicht zu viele), und - noch schlimmer - tendieren die dateispezifischen Projekteinstellungen dazu, vergessen/versteckt zu werden nicht in der IDE überhaupt aufgerufen. Wenn irgendwann (oder jemand anders) die Dinge geändert werden müssen, kann es ziemlich rätselhaft sein, warum der Build so seltsam für bestimmte Dateien funktioniert, bis jemand einen halben Tag damit beschäftigt ist, bis ihm klar wird, was los ist auf.

Ich würde persönlich bevorzugen, dass eine projektweite Einstellung von $(InputDir)\$(IntDir)\ Objektdateien dazu führen würde, Verzeichnisse relativ zur Quelldatei zu gehen, aber es funktioniert überhaupt nicht gut als Einstellung auf Projektebene. In diesem Fall setzt VS das Ausgabeverzeichnis nur einmal und es ist relativ zur ersten Quelldatei in der Liste. Dann wird der Linker verwirrt, wo er nach Objektdateien suchen soll.

+0

Dank für die Eingabe enthält; $ (InputDir) \ $ (IntDir) \ sieht vielversprechend aus, und/aber ich hätte wirklich gerne eine Projekteinstellung (aus den angegebenen Gründen), vorzugsweise sogar in einem propertysheet, so dass die Änderung offensichtlich wird. Ich bin nicht sehr besorgt über obj-Dateien, die meinen Source-Tree überfluten (auch wenn insgesamt einige hundert obj-Dateien generiert werden) –

+0

Nun, diese Lösung hat bei mir nicht funktioniert. Ich habe Fehler etwas über "kann Weg bla bla bla nicht finden". Also habe ich eine andere Lösung gefunden: Ich habe "fileWithSameName.cpp" aus meiner Lösung ausgeschlossen und eine weitere hinzugefügt, "AnotherFile.cpp", die darin enthalten ist, hat die einzige Zeile: [include "fileWithSameName.cpp"]. Es funktionierte für mich – Illidan

+3

Dies funktioniert nicht für mich in VS 2015. Aber der etwas andere Eigenschaftswert vorgeschlagen unter https://stackoverflow.com/questions/3695174/visual-studio-2010s-strange-warning-lnk4042/3731643# 3731643 funktioniert: $ (IntDir) /% (RelativeDir)/ – peastman

8

Vielleicht können Sie das Projekt breit ‚Objekt Dateinamen‘ gesetzt (Configurtion Eigenschaften-> C/C++ -> Ausgabedateien) zu

$(IntDir)%(RelativeDir) 

, die die relativen Quellordner der Quelldateien verwendet. Beachten Sie die %, aber das wird hässlich, wenn Ihre Quelldateien außerhalb Ihres Projektverzeichnisses befinden, ..\

+1

Eigentlich benötigen Sie am Ende Trennzeichen und einen Dateinamen. Dies löste es für mich: $ (IntDir) \% (RelativeDir) \% (Dateiname) .obj – Rudi

+0

Vielen Dank! Funktioniert als Charme. –