2010-02-09 6 views
7

Estoy clasificando archivos C y C++ para una clase, y esta asignación usa la biblioteca GSL. Como no tengo el permiso de root en mi computadora, mi biblioteca GSL está instalada en mi directorio de inicio y, por lo tanto, debo indicar a los compiladores y a los vinculadores dónde encontrarla.Diciendo ld dónde buscar directorios a través de una variable de entorno

Esto no es un problema cuando escribo un programa, porque simplemente agrego las banderas apropiadas -L e -I a gcc.

Pero cuando estoy compilando archivos de estudiantes, no quiero editar cada uno de sus archivos MAKE. En cambio, quiero poner los directorios apropiados en una variable de entorno, para que ocurra sin problemas.

Con este fin, me ha exportado las siguientes variables con la biblioteca o incluyen lugares: C_INCLUDE_PATH, CPLUS_INCLUDE_PATH, LIBRARY_PATH y LD_LIBRARY_PATH

Pero cuando compilo proyecto de un estudiante, con

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

Me sale el siguiente error:

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

Estoy usando gcc v 4.1.2. De hecho, no obtengo el error si uso gcc v 4.4, pero no tengo idea de por qué. Mi enlazador es:

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

Prueba man ld y man ld.so para entornos vars que utilizan. LD_LIBRARY_PATH podría funcionar. – Eugene

+2

Creo que LD_LIBRARY_PATH solo es usado por ld.so, no por ld. Dado que es un error en tiempo de compilación, no un error en tiempo de ejecución, me gustaría centrarme en por qué LIBRARY_PATH no funciona. Dos cosas que verificaría, ¿el archivo de la biblioteca tiene el nombre correcto y es LIBRARY_PATH actualmente definido en el entorno de ejecución de gcc? –

+0

Intente ejecutar gcc con la opción '-v' y publique la invocación completa de ld desde la salida. –

Respuesta

11

Usted podría tratar de usar el entorno LIBRARY_PATH variables

De man gcc (al menos la versión 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). 

Y a continuación, a continuación, utilizar LD_LIBRARY_PATH al ejecutar sus programas a a deje que el enlazador en tiempo de ejecución encuentre las bibliotecas.

+0

OP dijo que estaba usando LIBRARY_PATH (y no parece una edición desde su publicación). – jtniehof

0

Mi consejo es exigirles a los estudiantes que admitan una variable de entorno CFLAGS en sus archivos make, de lo contrario, fallan. :) Entonces puedes exportar CFLAGS = "- Lwhatever".

O podría usar LD_LIBRARY_PATH.

+0

Probablemente se refiera a LDFLAGS, ya que -l y -L son parámetros del enlazador, no parámetros del escenario del compilador. Pero sí, estoy de acuerdo. Los Makefiles sin estas variables son inútiles. –

2

Muchas de las respuestas anteriores sugieren el uso de LD_LIBRARY_PATH. Pero esto es incorrecto ya que es una variable de entorno para el enlazador dinámico (runtime), no el enlazador de tiempo de compilación ld.

La forma correcta de hacer esto es exigir a los estudiantes para añadir algo como:

-L$(EXTRA_LINK_DIRECTORY) 

en su Makefile en el punto en el que definen la regla de construcción. Entonces, cuando usted compilar, hacer algo como:

EXTRA_LINK_DIRECORY exportación =/home/...

1

Si estás en una máquina de 64 bits, que es probablemente el problema. OMM, gcc 4.1 no busca en las rutas especificadas en LIBRARY_PATH, sino en la ruta /../ lib64. Tendrá que especificar -L directamente, o vincular simbólicamente el directorio a lib64 en el mismo nivel, o meterse con las especificaciones de gcc.

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

(OMM, esto funciona con gcc 4.5 sin ningún tipo de problema, así que supongo que lo arreglaron más adelante.)

+0

Jugar con el archivo de especificaciones tampoco ayuda mucho, ya que hacer que busque solo lib significa que gcc no encuentra sus bits internos, y hacer que busque tanto lib como lib64 significa que gcc escupe un montón de advertencias para los archivos incompatibles 32- versiones de bits que encuentra. – jtniehof

+0

¡eso fue probablemente! Desde que instalé GSL yo mismo no tenía los directorios lib/y lib64 /, sino solo una ubicación con las bibliotecas (de 64 bits) pero sin el nombre/lib64 esperado. Esa es una característica bastante molesta. Supongo que gcc 4.4 y 4.5 tienen un mejor comportamiento – Stephen

Cuestiones relacionadas