Hallo Community,
Ich bin derzeit dabei ein Projekt zu basteln, welches mehrere Projekte beinhaltet. Ich habe 4 C++ Konsolenanwendungen und ein C#-Projekt in meiner Projektmappe. Nun muss ich aus den verschiedenen Projekten auf Dateien zugreifen, die teilweise im eigenen, teilweise in den anderen Projekten untergebracht sind. Ich möchte nicht einfach alles in einen Ordner packen, da die Struktur so wie sie ist erhalten bleiben soll.
Ich hatte überlegt noch ein Hilfsprogramm in die Projektmappe aufzunehmen, welches einfach statisch die Pfade zu den einzelnen Working Directorys beinhaltet.
Das würde ja an sich auch gehen, das Problem ist aber die Zuweisung.
Wenn ich ein Projekt starte und z.B. getcwd() aufrufe, dann bekomme ich ja nur den Pfad vom gestarteten Programm und ich komme nicht an die anderen, welche ich aber auch brauche, da wie gesagt auf Dateien zugegriffen werden soll, die relativ zu den anderen Projekten liegen. Es wird nebenbei auch nicht immer das gleiche Programm initial gestartet...
Vielleicht habt ihr ja eine clevere Lösung für das Problem. Wenn etwas unklar oder unverständlich ist, bitte nachfragen. 😃
Viele Grüße,
Hades
Hallo -Hades-,
wenn ich es richtig verstehe, gibt es vier Konsolenprogramme und jedes davon soll wissen, wo die anderen drei liegen? Aber ohne sich untereinander zu kennen (zumindest den eben deren Pfad nicht kennen). Dann kennt wohl nur das C# Projekt alle Projekte? Dann wirst du wohl auch nicht drumherum kommen, dass das C#-Projekte, den anderen Projekten die Pfade mitteilt, z.B. per Kommandozeilenparameter.
herbivore
Hallo Herbivore,
hmm ich glaube ganz so einfach ist es leider nicht. Das C# Projekt ist nicht, wie du vermutest, das Einstiegsprogramm. Es dient (zumindest bis jetzt) nur dazu Charts anzuzeigen, und muss dazu eben auch auf Dateien der anderen Projekte zugreifen. Später wird es vielleicht ein Haupteinstiegsprogramm geben, bis jetzt soll aber jedes für sich funktionieren. Es werden wohl Projekte untereinander benutzt, also es wird in dem einen Konsolenprogramm z.B. das andere inkludiert und benutzt. Kann man damit vielleicht etwas drehen? Ich habe ja z.B. die .obj Files im Linker stehen. Ich könnte die Pfade natürlich händisch im Code relativ setzen, mit dem Wissen der Projektstruktur, z.B. ..\ProgA\file usw. aber sollte sich die Projektstruktur ändern ist das auch wieder hinfällig.
Ich bekomme gerade das Gefühl das ich den oben genannten Kompromiss eingehen muss aber vielleicht kannst du mich ja positiv eines anderen belehren Herbivore oder auch jemand anderes. 😃
Noch ein kurzer Nachtrag,
das wurde nicht wirklich klar: Die Konsolenprogramme rufen sich gegenseitig per Code auf, sie werden also nicht im herkömmlichen Sinne per system() oder dergleichen gestartet. Lediglich das C# Programm wird aus einem Konsolenprogramm per system() gestartet und soll also als Argument einen relativen Pfad mitbekommen.
Hallo -Hades-,
also mir sind die Zusammenhänge immer noch unklar. "Linker" und ".obj-Files" klingt irgendwie so, also würden die vier Projekte zu einer EXE zusammen kompiliert. Wenn du nicht genau beschreibst, was in welcher Form wo vorliegt und wie zusammenarbeiten soll, ist es schwierig einen Rat zu geben.
herbivore
Die Programme werden alle als Anwendung kompiliert, jedoch benutze ich die Programme untereinander im Code. Also ProgA benutzt Klassen von ProgB usw. Dazu muss ich doch die header inkludieren und die .obj Files linken oder nicht? Das war zumindest mein Stand bis jetzt. Sollte das nicht so sein umso besser, aber das ändert nichts am Grundproblem.
Sagen wir mal so: ProgA möchte einfach in einer Methode den Pfad zu einer Datei kennen, welche relativ zu ProgB liegt, nicht mehr und nicht weniger.
Hallo -Hades-,
nur dass - wenn du eine .obj-Datei einkompilierst - nichts mehr woanders liegt. Die .obj-Datei liegt ja dann in der EXE, in die diese einkompiliert wird. Hier erstmal Punkt.
Woher soll die arme .obj.Datei wissen, dass es noch eine andere EXE gibt, in die dieselbe .obj-Datei - diesmal als Hauptbestandteil - einkompiliert wurde und wo diese andere EXE liegt? Außer man sagt es ihr explizit. Wobei das nicht hardcodiert im Code stehen sollte. Sondern besser in einer (gemeinsamen) Konfigurationsdatei.
herbivore
Hi,
wie wäre es denn mit einem Postbuild-Script, das die benötigten Daten in eine Datei schreibt, deren Ort per Konvention allen anderen bekannt ist?
Grüße
Christian
(edit) Herbivore hat gerade einen ähnlichen Gedanken gepostet
Also als Pfade für die .obj Files habe ich den Debug-Ordner des betreffenden Projekts angegeben, da wo AUCH die exe liegt...
Könnte ich also anstatt der .obj einfach die EXE linken?
Wie würde man denn vorgehen um so eine Knfigurationsdatei zu erstellen?
Ich kann mir darunter gerade nichts genaues vorstellen.
Danke für eure Hilfe dabei!
Hallo -Hades-,
Könnte ich also anstatt der .obj einfach die EXE linken?
nein
Wie würde man denn vorgehen um so eine Knfigurationsdatei zu erstellen?
Wenn es um .NET gehen würde, würde ich sagen, [Tutorial] Konfigurationsmodell im .NET Framework. Da es aber um C++ geht, tut es eine einfache XML- oder sogar INI-Datei. (Damit sind wir dann allerdings bei [Hinweis] Wie poste ich richtig? Punkt 1.1.1 (und ggf. 1.1) angelangt. Das solltest du aus eigener Kraft hinbekommen.
herbivore
Hmm ok, dann habe ich deinen Einwand mit der EXE nicht verstanden.
Das mit der ini oder einer xml-Datei ist ja schön und gut jedoch kommen wir dann ja wieder zum eigentlichen Problem zurück, weswegen ich ja hier bin. 😄
WIE kommen die Pfadangaben in die ini...? Sie per Hand rein zu schreiben ist eben nicht das Ziel.
Gruß Hades
Hallo -Hades-,
aus meiner Sicht, drehen wir uns im Kreis, bzw. brauchen endlos, weil du an keiner Stelle mal genau die Situation beschrieben hast.
Machen wir es nochmal langsam, aber abschließend. Du hast vier Projekte. Gut. Wenn du jedes Projekt einzeln erstellst hast du vier EXE, die an vier verschiedenen Orten liegen. Auch gut. Nun sollen sich die Projekte untereinander benutzen. Auch gut. Nur tut sie das nicht, indem sie die jeweils andere EXE aufrufen, sondern indem du die .obj-Dateien - und das habe ich nicht genau verstanden - in eine einzige EXE-Datei kompilierst oder in vier EXE-Dateien, in die aber die jeweils benötigten anderen .obj-Dateien mit einkompiliert sind. Wie dem auch sei. Die anderen Orte sind nicht bekannt. Also musst du sie - sinnvollerweise - in eine Config-Datei schreiben. Ob nun von Hand oder per Build-Script - wie das chriscolm vorgeschlagen hat - oder per einem etwaig existierenden Installationsprogramm, ist mehr eine Frage der Bequemlichkeit, als dass das einen generellen Unterschied macht.
Mehr gibt es hier wohl nicht zu sagen.
herbivore