2010-02-09 10 views
7

Ich bewerte C- und C++ - Dateien für eine Klasse und diese Zuweisung verwendet die GSL-Bibliothek. Da ich keine root-Berechtigung auf meinem Computer habe, ist meine GSL-Bibliothek in meinem Home-Verzeichnis installiert, und ich muss Compilern und Linkern mitteilen, wo ich sie finden kann.Telling ld wo über eine Umgebungsvariable nach Verzeichnissen gesucht wird

Das ist kein Problem, wenn ich selbst ein Programm schreibe, weil ich nur die entsprechenden -L und -I Flags zu gcc hinzufügen.

Aber wenn ich Studentendaten kompiliere, möchte ich nicht jedes ihrer Makefiles bearbeiten. Stattdessen möchte ich die entsprechenden Verzeichnisse in eine Umgebungsvariable einfügen, so dass es nahtlos passiert.

Zu diesem Zweck habe ich die folgenden Variablen mit der Bibliothek exportiert oder umfassen Standorte: C_INCLUDE_PATH CPLUS_INCLUDE_PATH, LIBRARY_PATH und LD_LIBRARY_PATH

Aber wenn ich kompilieren eines Schülers Projekt, mit

gcc -Wall -o MC_thread MC_thread.c -lgsl -lgslcblas -lpthread -lm 

Ich erhalte den folgenden Fehler:

/usr/bin/ld: cannot find -lgsl 
collect2: ld returned 1 exit status 
make: *** [all] Error 1 

Ich benutze gcc v 4.1.2. Ich bekomme den Fehler eigentlich nicht, wenn ich gcc v 4.4 benutze, aber ich habe keine Ahnung warum. Mein Linker ist:

ld -V 
GNU ld version 2.17.50.0.6-12.el5 20061020. 
+1

Versuchen Sie Mann ld und Mann ld.so für Umwelt vars sie benutzen. LD_LIBRARY_PATH könnte funktionieren. – Eugene

+2

Ich denke LD_LIBRARY_PATH wird nur von ld.so, nicht von ld verwendet. Seit Dies ist ein Fehler bei der Kompilierung, kein Laufzeitfehler, würde ich Fokus auf warum LIBRARY_PATH nicht funktioniert. Zwei Dinge, die ich verifizieren würde, hat die Bibliotheksdatei den richtigen Namen und ist LIBRARY_PATH tatsächlich in der GCC-Ausführungsumgebung definiert? –

+0

Versuchen Sie, gcc mit der Option '-v' auszuführen, und senden Sie die vollständige Invokation ld von der Ausgabe. –

Antwort

11

Sie könnten versuchen, die Umgebungsvariable LIBRARY_PATH

Von man gcc (mindestens Version 4,4)

 
     LIBRARY_PATH 
      The value of LIBRARY_PATH is a colon-separated list of directories, 
      much like PATH. When configured as a native compiler, GCC tries 
      the directories thus specified when searching for special linker 
      files, if it can't find them using GCC_EXEC_PREFIX. Linking using 
      GCC also uses these directories when searching for ordinary 
      libraries for the -l option (but directories specified with -L come 
      first). 

Und dann dann LD_LIBRARY_PATH unter Verwendung verwenden, wenn Sie ihre Programme ausführen, um zu Lassen Sie den Runtime-Linker die Bibliotheken finden.

+0

OP sagte, er benutzte LIBRARY_PATH (und es sieht nicht wie eine Bearbeitung seit dem Post aus.) – jtniehof

0

Mein Rat ist, dass die Schüler eine CFLAGS-Umgebungsvariable in ihren Makefiles unterstützen müssen, sonst scheitern sie. :) Dann können Sie CFLAGS = "- Lwhatever" exportieren.

Oder Sie könnten LD_LIBRARY_PATH verwenden.

+0

Sie meinen wahrscheinlich LDFLAGS, da -l und -L Linker-Parameter sind, nicht Compiler-Stage-Parameter. Aber ja, ich stimme zu. Makefiles ohne diese Variablen sind nutzlos. –

2

Viele der Antworten oben schlagen die Verwendung von LD_LIBRARY_PATH vor. Dies ist jedoch falsch, da dies eine Umgebungsvariable für den dynamischen (Laufzeit-) Linker ist, nicht den Kompilierzeit-Linker ld.

Der richtige Weg, dies zu tun ist, um die Schüler zu benötigen etwas wie anfügen:

an dem Punkt
-L$(EXTRA_LINK_DIRECTORY) 

in ihrem Makefile, an den sie die Build-Regel definieren. Dann, wenn Sie kompilieren, so etwas wie:

Export EXTRA_LINK_DIRECORY =/home/...

1

Wenn Sie auf einer 64-Bit-Maschinen sind, dann ist das wahrscheinlich das Problem. OMM, gcc 4.1 durchsucht nicht die in LIBRARY_PATH angegebenen Pfade, sondern path /../ lib64. Sie müssen -L direkt angeben oder das Verzeichnis mit Lib64 auf der gleichen Ebene verknüpfen oder die gcc-Spezifikationen ignorieren.

Siehe http://gcc.gnu.org/ml/gcc-help/2010-11/msg00360.html und Why does g++ look in LIBRARY_PATH/../lib64 and where is this documented?

(OMM dieses 4 mit gcc funktioniert.5 ohne irgendwelche Unordnung herum, also ich vermute, dass sie es später reparierten.)

+0

Das Spielen mit der Spec-Datei hilft auch nicht viel, da die Suche nur lib bedeutet, dass gcc seine internen Bits nicht findet und die Suche nach lib und lib64 bedeutet, dass gcc eine Reihe von Warnungen für die inkompatible 32- Bit-Versionen findet es. – jtniehof

+0

das war es wohl! Da ich GSL selbst installiert habe, hatte ich nicht die Verzeichnisse lib/und lib64 /, sondern nur einen Speicherort mit den (64-Bit-) Bibliotheken, aber ohne den erwarteten lib64/Namen. Das ist eine ziemlich nervige Funktion. Ich denke, GCC 4.4 und 4.5 haben ein besseres Verhalten – Stephen

Verwandte Themen