2012-09-25 4 views
7

Ich versuche, ein C++ zu bauen und zu verknüpfen, cmake-basiertes Projekt mit Klirren (3.0). Dieses Projekt ist mit mehreren Bibliotheken verknüpft, die in einem benutzerdefinierten Verzeichnis/my/dir/installiert sind. Dieses Verzeichnis ist in den Umgebungsvariablen LD_LIBRARY_PATH und LIBRARY_PATH enthalten. Projekt baut und verlinkt gut mit g ++.Clang Linker sieht nicht in LD_LIBRARY_PATH

Der Link-Befehl von cmake generiert und ausgeführt sieht wie folgt aus:

/usr/bin/clang++ -O3 stuff.cpp.o -o stuff -rdynamic -lmylib 

ld beschwert sich dann mit der folgenden Meldung:

/usr/bin/ld: cannot find -lmylib 

Der Link-Befehl über fein läuft, wenn ich -L/my/dir/ manuell hinzufügen . Gibt es eine Möglichkeit, ohne Angabe des Flags -L zu verknüpfen?

+3

[LD_LIBRARY_PATH'] (http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html) dient zum Laden von Bibliotheken beim Start, nicht zum Auflösen von Linkabhängigkeiten. Vielleicht möchten Sie 'LDFLAGS' verwenden? –

+0

Interessant. Ich benutze __g ++ __ und __clang ++ __ austauschbar mit CMake aber noch nie ein ähnliches Problem. Ich benutze einfach das Makro 'link_directories()', um den Bibliothekspfad zu definieren. – Hindol

Antwort

7

Die $LD_LIBRARY_PATH Umgebungsvariable (und seine verschiedenen Alternativen auf anderen UNIX-basierte Plattformen) an Laufzeit, nicht Link Zeit, benutzte Bibliotheken zu finden.

-L Verwendung ist der richtige Ansatz und nicht vermieden werden kann.

Hinweis: Ein besserer Ansatz unter Linux (Sie geben Ihre Plattform nicht an, damit ich rate) ist, eine Datei korrekt in /etc/ld.so.conf.d/ zu konfigurieren und zu vermeiden, $LD_LIBRARY_PATH insgesamt zu verwenden.

+1

Beachten Sie, dass ich auch die Variable LIBRARY_PATH definiert habe. Wie in dieser Frage erklärt http://stackoverflow.com/questions/4250624/ld-library-path-vs-library-path diese Variable ist, was gcc die benutzerdefinierten Bibliotheken zu finden. Ich suche etwas Ähnliches für Clang. –

+0

@ RégisB. Interessant; Ich habe 'LIBRARY_PATH' noch nie benutzt. Was ist das Problem mit '-L'? – trojanfoe

+1

Die Option -L erfordert eine Änderung der Cmake Konfiguration, die mit meinen Kollegen geteilt wird. Ich werde jetzt versuchen, die /etc/ld.so.conf.d/ Weg zu gehen. –