2010-02-18 7 views
5

Im Qmake mit einer gemeinsam genutzten Bibliothek auf Ubuntu 9.10 bauenld Verknüpfung Probleme:/usr/bin/ld: nicht finden können [bibliotheks]

Diese gemeinsame Bibliothek (A) eine Abhängigkeit von einem anderen gemeinsam genutzten Bibliothek (B) .

Projekt B wurde erfolgreich erstellt.

in der .pro-Datei für Projekt A, sieht meine LIBS Variable wie folgt aus:

LIBS += -L../datelib/bin -llibdatelib_release.so.1.0.0 

(ich die volle shlib Namen verwendet, weil die Bibliothek Versionen unterschiedlich sind.)

In jedem Fall wenn ich versuche, Projekt A zu bauen, bricht es an der Verknüpfungsstufe und gibt die Fehlermeldung:

/usr/bin/ld: cannot find -llibdatelib_release.so.1.0.0 
collect2: ld returned 1 exit status 
make[1]: ***[bin/libprojecta_release.so.6.0.0] Error 1 
make ***[release] Error 2 
Exited with code 2 

Von der Fehlermeldung, dachte ich ld beschwert wurde, dass es nicht kann l ocate die libdatelib-Datei, so habe ich manuell kopiert es nach/usr/lib/

jedoch, das das Problem nicht gelöst hat, und ich bekomme die gleiche Fehlermeldung.

Kann jemand das beheben?

[Bearbeiten]

Ich bin ganz neu mit gcc zu bauen. Ich weiß, wie man symbolische Verbindungen herstellt, aber welche Wege ich für den lnk-Befehl verwende ?. Die Datei, zu der ich verlinken möchte, befindet sich in/home/username/work/cppdev/datelib/bin.

Auch das Build-System I (qmake) verwenden, erstellt automatisch symbolische Links als Teil des Build, so habe ich bereits die folgenden Dateien in meinem/home/username/work/cppdev/DateLib/bin-Ordner:

  • libdatelib_release.so (sym link)
  • libdatelib_release.so.1 (sym link)
  • libdatelib_release.so.1.0 (sym link)
  • libdatelib_release.so.1.0.0 (shared lib)

Ich muss vielleicht eine andere Frage stellen, um zu erklären, warum es so viele Symlinks gibt (was ist der Punkt?), Und warum ich nicht direkt mit einer gemeinsamen Lib verlinken kann, sondern einen symbolischen Link durchlaufen muss. Ich habe einige Online-Dokumente gelesen, aber das, was ich bisher gesehen habe, scheint mehr wie Diktum/Tradition und nicht aus technischen Gründen zu sein. Warum ist dieses Abstraktionsniveau beim Linken unter Linux erforderlich?

+0

Ich bin kein Experte für den Aufbau und die Verknüpfung unter Linux und haben oft hatte ähnliche Probleme bei Ihnen hinzufügen. Was ich jedoch tun kann, ist, den folgenden hervorragenden Artikel über den Umgang mit gemeinsam genutzten Bibliotheken auf IBM DeveloperWorks zu empfehlen: [** _ Aufteilen von gemeinsam genutzten Bibliotheken - Lernen Sie Ihre gemeinsam genutzte Bibliothek kennen _ ** (von Peter Seebach)] [seebach]. Der Abschnitt _ "Dynamischen Linker-Suchpfad ändern" _ könnte für Sie besonders interessant sein. [seebach]: http://www.ibm.com/developerworks/linux/library/l-shlibs.html – stakx

Antwort

9

Sie können -l nicht auf diese Weise verwenden. -l kann nur Dinge mit Namen wie libFOO.so finden, über -lFOO. Sie benötigen einen symbolischen Link ohne die Versionsnummer, wenn Sie dies im Build so angeben möchten.

Etwas wie:

ln -s /the/path/to/the/libthing.so.1.0.0 /the/path/to/the/libthing.so 

Jetzt funktioniert -lthing.

+0

Entschuldigung, ich bin ziemlich neu im Aufbau auf Linux. Ich weiß, wie man symbolische Verbindungen herstellt, aber welche Wege ich für den lnk-Befehl verwende ?. Die Datei, die ich verlinken möchte, ist in/home/username/work/cppdev/datelib/bin –

3

Das Präfix ‚lib‘ ist mit dem Bibliotheksnamen automatisch hinzugefügt - Verwendung:

LIBS += -L../datelib/bin -ldatelib_release.so.1.0.0 
+0

Diese dosent arbeiten für mich ... –

0

Sie vollständigen Pfad bereitstellen können. das heißt

LIBS += ../datelib/bin/libdatelib_release.so.1.0.0 

aber ich Ihnen empfehlen würde, zu tun, was vorgeschlagen bmargulies: symolic Link erstellen und -ldatelib_release

+0

Diese dosent arbeiten für mich ... –