PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Static Library]: Grundsätzliche Fragen zur Erstellung?


pajofego
2007-02-08, 22:37:31
Hallo miteinander,

ich habe aus einem open source Projekt, dass ein Projekt File für Dev C++ beinhaltet, eine static library erfolgreich erstellt. Das Einbinden der library sowie das Kompilieren der Beispielanwendung hat problemlos funktioniert.

Nun wollte ich das ganze auch mal mit eclipse und CDT versuchen. Dazu habe ich ein managed projekt für eine static library erstellt, alle source Dateien in das Projekt geladen. Die Bibliothek wurde ebenfalls ohne Probleme erstellt.

Jetzt nun zu meinem Probelm: Beim Einbinden der library, die ich in eclipse problemfrei erstellt habe, in das Beispielprogramm (egal ob in DEV-C++ oder eclipse) erscheinen beim Kompilieren stetst mehrere Fehlermeldungen vom gleichen Problemtyp:

siehe hier:

C:\..\libFFL_Eclipse_static_Lib.a(BeispielKlasse.o)(.text+0x222):BeispielKlasse. cc: undefined reference to `BeispielKlasse::get_BeispielFunktion()'

Puuh, habt ihr einen Hinweis für mich wo ich den Unterschied bzw. den Fehler zu suchen habe?

Ich interpretiere das ganze so, dass ich nicht das gleiche in eclipse durchführe um die library zu erstellen, wie das schon mitgelieferte Dev C++ Projekt.

Im voraus schon mal danke und viele Grüße

pajofego

class Foo: pass
2007-02-09, 10:26:20
Hallo,

ich hab folgende Vermutungen:
1. In deinem Eclipse Projekt übersetzt du nicht alle source files.
2. Es werden nicht alle object files ins archieve (in die statische library) gepackt.
3. Das Beispielprogram hat noch zusätzliche Abhängigkeiten.

lg,
Stefan

pajofego
2007-02-09, 23:06:37
Hallo,

ich hab folgende Vermutungen:
1. In deinem Eclipse Projekt übersetzt du nicht alle source files.
2. Es werden nicht alle object files ins archieve (in die statische library) gepackt.
3. Das Beispielprogram hat noch zusätzliche Abhängigkeiten.

lg,
Stefan

Hi,

zu Punkt 1: Soweit ich das verstehe, ist der Garant für ein richtiges Übersetzen die entsprechende Datei mit der Endung *.o oder nicht?

zu Punkt 2: Das ist ein guter Hinweis, nur weiß ich nicht, wie ich das überprüfen kann. Hast du eine Idee für mich?

zu Punkt 3. Nein, weil wenn ich die library nehme, die ich mit dev-cpp compiliert/erstellt habe, dann kann ich das Programm unter Eclipse problemlos erstellen. Es sei denn du meintest was anderes?

Sonst noch evt. weitere Hinweise?

Danke und Gruß

pajofego

class Foo: pass
2007-02-11, 10:34:52
Hallo,


zu Punkt 1: Soweit ich das verstehe, ist der Garant für ein richtiges Übersetzen die entsprechende Datei mit der Endung *.o oder nicht?

Ich weiss zwar nicht was du unter "richtigem übersetzen" verstehst, aber .o ist die übliche extension für object files die mit dem GNU compiler erstellt wurden.
In einer library hast du üblicherweise nicht nur ein .o file sondern viele.
Du könntest dich also vergewissern, dass das Eclipse Projekt genau so viele object files erzeugt wie das Original dev-cpp Projekt.


zu Punkt 2: Das ist ein guter Hinweis, nur weiß ich nicht, wie ich das überprüfen kann. Hast du eine Idee für mich?

Das ist relativ einfach. Da eine statische library einfach ein komprimiertes Archiv von object files ist, kannst du einfach überprüfen ob die Anzahl der files in der mit dev-cpp erstellten library ident ist zur Anzahl der files der statischen library die du mit Eclipse erstellst.
Wenn nicht, dann schau einfach welche object files dir in deiner library fehlen.


zu Punkt 3. Nein, weil wenn ich die library nehme, die ich mit dev-cpp compiliert/erstellt habe, dann kann ich das Programm unter Eclipse problemlos erstellen. Es sei denn du meintest was anderes?

Ok, dann ist dieser Punkt hinfällig.

lg,
Stefan

pajofego
2007-02-11, 16:03:48
Hi,

zu Punkt 1: In der tat meinte ich die object files. Die werden alle erstellt. Und eclipse erstellt genauso soviele objectfiles wie dev-cpp

zu Punkt2: So nun habe ich mir mit Hilfe von Msys den Inhalt beider Archive angeschaut. Also es sind in beiden genau 20 object files und genau die gleichen. Nur die Anordnung ist unterschiedlich! D.h. die Liste der object files im mit dev-cpp erstellten Archiv ist anders wie das mit eclipse erstellte Archiv. Nun meine naive Frage: Ist das ein möglicher Hinweis? D.h. ist die Reihenfolge wie er die object files ins archieve reinpackt von Bedeutung? Wenn ja, wie beeinflusst man die Reihenfolge in eclipse?

Danke Gruß

pajofego

pajofego
2007-02-11, 16:21:28
mmh...hab's jetzt von Hand aus in die richtige Reihenfolge reingepackt. Fehler blieb der gleiche :confused: Was mich noch stutzig macht ist die unterschiedliche Dateigröße des Archivs. Bei der Erstellung mit DevCpp ist diese fast doppelt so groß. Beide wurden mit ausgeschalteter Debug Option erstellt.

Habt ihr noch weitere Ideen?

Danke Gruß

pajofego

class Foo: pass
2007-02-11, 18:34:17
Hallo,

mmh...hab's jetzt von Hand aus in die richtige Reihenfolge reingepackt. Fehler blieb der gleiche :confused: Was mich noch stutzig macht ist die unterschiedliche Dateigröße des Archivs. Bei der Erstellung mit DevCpp ist diese fast doppelt so groß. Beide wurden mit ausgeschalteter Debug Option erstellt.


die Reihenfolge ist egal.
Ok, da die Anzahl der object files in beiden libs ident ist, und du erwähnst dass die Grösse unterschiedlich ist, nehm ich mal an, dass du irgendwelche C/C++ preprocessor defines vergesessen hast.

lg,
Stefan

pajofego
2007-02-12, 22:47:34
Hallo,



die Reihenfolge ist egal.
Ok, da die Anzahl der object files in beiden libs ident ist, und du erwähnst dass die Grösse unterschiedlich ist, nehm ich mal an, dass du irgendwelche C/C++ preprocessor defines vergesessen hast.

lg,
Stefan

mmmh...wenn ich das makefile der mit dev-cpp erstellten library, sprich die die funktioniert, studiere, dann kann ich keine Präprozessordirektive finden. Zumindestens keine die mit "-D" anfängt.

Kann ich denn dann zwangsläufig davon ausgehen, dass es nicht an den Präprozessordirektiven hängt? Wenn ja, was nun :confused:

Gruß

pajofego

Gast
2007-02-14, 15:22:08
ne Idee wäre, daß es am Name-Mangling liegt: der von CDT benutzte Compiler dekoriert Funktionsnamen anders als der von Dev-C++, deswegen findet der Linker von Dev-C++ in der lib nicht diejenigen Funktionsnamen vor, die er erwartet.
Sofern du bei CDT den gleichen mingw-Compiler eingestellt hast wie bei Dev-C++, kann das aber eigentlich nicht sein.

pajofego
2007-02-15, 22:16:23
ne Idee wäre, daß es am Name-Mangling liegt: der von CDT benutzte Compiler dekoriert Funktionsnamen anders als der von Dev-C++, deswegen findet der Linker von Dev-C++ in der lib nicht diejenigen Funktionsnamen vor, die er erwartet.
Sofern du bei CDT den gleichen mingw-Compiler eingestellt hast wie bei Dev-C++, kann das aber eigentlich nicht sein.

Bei beiden greife ich auf den gleichen MinGW zu. Sollte demnach nicht daran liegen. :confused:

@ class Foo: pass: Konntest du schon etwas entdecken, oder mit den Dateien die ich dir geschickt habe etwas anfangen?

Danke Gruß

pajofego