Zwei C++ Projekte zusammenführen
-
Hallo zusammen,
ich habe folgendes Problem (evtl. mehr ein Denkfehler -- für Denkanstöße wäre ich sehr dankbar :> ).
Ich habe zwei Projekte A und B. Beide Projekte an sich sind recht groß, haben eigene Makefiles und werden korrekt gebaut, laufen und sind fröhlich.
Nun möchte ich in Projekt A eine Funktion von Projekt B aufrufen (oder eine Klasse aus B instanzieren). Hierzu teile ich Projekt A per forward-Deklaration über die passende Header-Datei die entsprechende Funktion mit, und sage dem Makefile von Projekt A wo es das passende Objekt File findet (und lasse das Makefile von B vorher von A ausführen).
Nun meldet mir der Compiler beim bauen von A ettliche "undefined reference to" Errors, zu includes die die Funktion benötigt. Wieso? Ich kann im Makefile von A doch nicht alle Objekt-Files von B eintragen.
Falls mein Ansatz komplett falsch ist, wie sollte ich anders vorgehen?
Wie man vermutlich merkt sind meine C++ Kenntnisse ein wenig in die Jahre gekommen, ich wäre über alle "Denkanstöße" sehr dankbar..
-
Freiheit++ schrieb:
Falls mein Ansatz komplett falsch ist, wie sollte ich anders vorgehen?
Komplett falsch ist übertrieben, eigentlich sollte es so irgendwie gehen.
Allerdings nimmt man in solch einem Fall lieber static libraries.
-
etty ott schrieb:
Komplett falsch ist übertrieben, eigentlich sollte es so irgendwie gehen.
Allerdings nimmt man in solch einem Fall lieber static libraries.
Danke!
Static Libraries: Ja, darüber hatte ich auch schon nachgedacht bzw. Google angeschmissen. Was ich gelernt habe: Static libraries sind von scratch her sehr einfach zu erstellen. Allerdings habe ich es nicht hinbekommen das Makefile von B so umzuschreiben dass es mir ein Library baut (kommt mir auch immernoch ein bisschen übertrieben vor. Irgendwie muss man den Code den man vorliegen hat doch auch einfach einbauen können )
Ich verstehe auch noch nicht genau woher das Problem kommt. Wenn ich doch schon das objekt-file gebaut habe, warum weiß dann der Linker nicht wie er an die darin enthaltenen Referenzen rankommt?
-
Freiheit++ schrieb:
Nun meldet mir der Compiler beim bauen von A ettliche "undefined reference to" Errors, zu includes die die Funktion benötigt. Wieso? Ich kann im Makefile von A doch nicht alle Objekt-Files von B eintragen.
Aber genau das musst du.
Ausser du nimmst eine [statische] Library
Nochmal ausführlich:
Das frisch-fröhlich laufende Projekt A musst du doch auch zusammengelinkt haben.
gcc a.o b.o c.o d.o -o projekt_a
Jetzt nimmst du halt stattdessen ein
ar rcs projekt_a.a a.o b.o c.o d.o
und schon hast du die statische Bibliothek.Und bei deinem
gcc a.o b.o c.o d.o -o projekt_a
Nimmst du halt jetzt ein
gcc ../../pfad/zum/proj_a/projekt_a.a e.o f.o g.o h.o -o projekt_b
-
etty ott schrieb:
Freiheit++ schrieb:
Nun meldet mir der Compiler beim bauen von A ettliche "undefined reference to" Errors, zu includes die die Funktion benötigt. Wieso? Ich kann im Makefile von A doch nicht alle Objekt-Files von B eintragen.
Aber genau das musst du.
Ok, vielen Dank für deine Beharrlichkeit. Das hat geklappt. Alle .o files eingesammelt, im Makefile eingebaut und es läuft. Umständlich, aber muss wohl so sein.
Die Static-Library funktioniert so leider nicht. Zwar hat dein Tip auch funktioniert, ich konnte eine Library bauen die offenbar Teile von B enthält. Leider fehlt dort aber was (das Projekt besteht aus mehreren Verzeichnissen mit Makefiles die absteigend aufgerufen werden), der Compiler wirft weiterhin Fehler weil er Dinge nicht kennt.. anyway.
Problem gelöst, vielen Dank!