2010-12-28 19 views
0

Ich versuche, eine XPCOM-Komponente für Firefox 3.6. *. Es verwendet die statisch kompilierte libsqlite3 Version 3.7.4 (mit programmunabhängiger Codegenerierung - Option fPIC-Compiler). Das Problem, auf das ich stoße, ist, dass sobald Firefox die Komponente lädt und es startet, die sqlite3_libversion_number() 3007001 zurückgibt, während das Makro SQLITE_LIBVERSION_NUMBER auf 3007004 festgelegt ist. Ich bin mir ziemlich sicher, dass ich mit der korrekten statischen sqlite3-Bibliothek ... Aber wie kann ich das überprüfen? ldd Ausgabe des generierten generierten Objekts listet libsqlite3.so nicht als Abhängigkeit auf (obwohl libxul.so, das zum Erstellen der XPCOM-Komponente verwendet wird, libsqlite3.so verwendet). Wie werden alle sqlite3 Funktionsaufrufe in eine andere Version von SQLite aufgelöst?Statische Verknüpfung einer Bibliothek unter Linux

PS: Liegt es daran, dass die Bibliotheken mit -fPIC kompiliert werden und Firefox sie später mit dlopen lädt?

Antwort

0

Ich schaue auf die Einschlussreihenfolge. Ich habe auch einen ganzen Tag oder etwas Ähnliches verbracht und mich gefragt, warum das fseek() fehlschlug, nicht direkt auf Linux, sondern auf Bada und mit Eclipse IDE. Der Haken dabei war, dass die gleiche Funktion mit der gleichen Signatur von einer "Beta" -Stufe .a-Datei von Bada SDK exportiert wurde. Und ich habe versehentlich die falsche .a-Datei importiert.

+0

Ja ... Einschluss-Reihenfolge ist sehr wichtig beim Verlinken gegen statische Bibliotheken, die mit diesen Linker-Flags (aus g ++) gelöst werden: '-Wl, - Start-Gruppe -Wl, - -Endgruppe ". Dies führt dazu, dass der Linker rekursiv nach Symbolen in diesen Archiven sucht. – themoondothshine

0

In Linux wird es rekursive Symbolauflösung durchführen - d. H. Wenn libxul libsqlite3 verwendet, wird firefox indirekt das Symbol auflösen, indem es libsqlite3 aus libxul einfügt.

Dies ist nicht der Fall in AIX-Maschine - wo rekursive Symbolauflösung (basierend auf abhängigen Bibliotheken) nicht getan wird.

Dies ist möglicherweise nicht das eigentliche Problem - aber es lohnt sich zu überprüfen.

Überprüfen Sie auch, ob sqlite3 abwärtskompatibel ist (was ich denke), dann können Sie libxul und andere Bibliotheken mit der neuesten Version von sqlite3 verknüpfen.

+0

Ja, SQLite ist sehr abwärtskompatibel, aber das erneute Erstellen von libxul aus der Quelle ist momentan keine Option ... – themoondothshine

+0

Wenn libxul dynamisch mit sqlite verbunden ist, muss libxul nicht kompiliert werden. Es kann direkt in den LD_LIB_PATH eingefügt werden. Ich bin nicht sicher, warum es kompiliert werden muss. –

Verwandte Themen