2010-02-09 9 views
7

Je classe des fichiers C et C++ pour une classe, et cette affectation utilise la bibliothèque GSL. Comme je n'ai pas d'autorisation root sur mon ordinateur, ma bibliothèque GSL est installée dans mon répertoire personnel, et j'ai donc besoin de dire aux compilateurs et aux linkers où le trouver.Indiquer à ld où rechercher les répertoires via une variable d'environnement

Ce n'est pas un problème lorsque j'écris un programme moi-même, car j'ajoute juste les indicateurs -L et -I appropriés à gcc.

Mais quand je compile des fichiers d'étudiant, je ne veux pas éditer chacun de leurs makefiles. Au lieu de cela, je veux mettre les répertoires appropriés dans une variable d'environnement, afin que cela se passe de façon transparente.

À cette fin, j'ai exporté les variables suivantes avec la bibliothèque ou comprennent des emplacements: C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, LIBRARY_PATH et LD_LIBRARY_PATH

Mais quand je compile le projet d'un étudiant, avec

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

Je reçois l'erreur suivante:

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

J'utilise gcc v 4.1.2. En fait, je ne reçois pas l'erreur si j'utilise gcc v 4.4, mais je n'ai aucune idée pourquoi. Mon éditeur de liens est:

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

Essayez man ld et man ld.so pour les vars d'environnement qu'ils utilisent. LD_LIBRARY_PATH peut fonctionner. – Eugene

+2

Je pense que LD_LIBRARY_PATH est seulement utilisé par ld.so, pas par ld. Puisque est une erreur de compilation, pas une erreur d'exécution, je voudrais se concentrer sur pourquoi LIBRARY_PATH ne fonctionne pas. Deux choses que je vérifierais, est-ce que le fichier de bibliothèque a le bon nom et est LIBRARY_PATH actuellement défini dans l'environnement d'exécution de gcc? –

+0

Essayez d'exécuter gcc avec l'option '-v' et publiez l'invocation complète de ld depuis la sortie. –

Répondre

11

Vous pouvez essayer d'utiliser la variable d'environnement LIBRARY_PATH

De man gcc (au moins la 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). 

Et puis utilisez LD_LIBRARY_PATH lorsque vous exécutez leurs programmes à de Laissez l'éditeur de liens d'exécution trouver les bibliothèques.

+0

OP a dit qu'il utilisait LIBRARY_PATH (et cela ne ressemble pas à une modification depuis votre publication). – jtniehof

0

Mon conseil est d'exiger que les élèves supportent une variable d'environnement CFLAGS dans leur makefile, sinon ils échouent. :) Ensuite, vous pouvez exporter CFLAGS = "- Lwhatever".

Ou vous pouvez utiliser LD_LIBRARY_PATH.

+0

Vous voulez probablement dire LDFLAGS, puisque -l et -L sont des paramètres de liens, pas des paramètres de l'étape de compilation. Mais oui, je suis d'accord. Makefiles sans ces variables sont inutiles. –

2

Beaucoup de réponses ci-dessus suggèrent l'utilisation de LD_LIBRARY_PATH. Mais ceci est incorrect car c'est une variable d'environnement pour le lieur dynamique (runtime), pas pour le lieur de temps de compilation ld.

La bonne façon de le faire est d'exiger des étudiants d'ajouter quelque chose comme:

-L$(EXTRA_LINK_DIRECTORY) 

dans leur Makefile au point où ils définissent la règle de construction. Puis, quand vous compilez, faire quelque chose comme:

export EXTRA_LINK_DIRECORY =/home/...

1

Si vous êtes sur une machine 64 bits, qui est probablement le problème. OMM, gcc 4.1 ne recherche pas les chemins spécifiés dans LIBRARY_PATH, mais plutôt path /../ lib64. Vous devrez spécifier -L directement, ou créer un lien symbolique entre le répertoire et lib64 au même niveau, ou vous amuser avec les spécifications de gcc.

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

(OMM, cela fonctionne avec gcc 4.5 sans avoir à déconner, donc je devine qu'ils l'ont réparé plus tard.)

+0

Jouer avec le fichier spec ne sert pas à grand-chose, non plus, puisque le fait de rechercher seulement lib signifie que gcc ne trouve pas ses bits internes, et le fait de rechercher lib et lib64 signifie que gcc crache un tas d'avertissements. versions de bits qu'il trouve. – jtniehof

+0

c'était probablement ça! Comme j'ai installé GSL moi-même, je n'avais pas les répertoires lib/et lib64 /, juste un emplacement avec les bibliothèques (64 bits) mais sans le nom/lib64 attendu. C'est une fonction assez ennuyante. Je suppose que gcc 4.4 et 4.5 ont un meilleur comportement – Stephen