<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Compilación</title><meta name="generator" content="DocBook XSL Stylesheets V1.64.0"><link rel="home" href="index.html" title="Guía de Referencia"><link rel="up" href="install-free-software-chapter.html" title="Capítulo 12. Compilando e instalando software libre"><link rel="previous" href="install-free-config.html" title="Configuración"><link rel="next" href="install-free-installation.html" title="Instalación"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Compilación</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="install-free-config.html">Anterior</a> </td><th width="60%" align="center">Capítulo 12. Compilando e instalando software libre</th><td width="20%" align="right"> <a accesskey="n" href="install-free-installation.html">Siguiente</a></td></tr></table><hr></div><div class="sect1" lang="es"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="install-free-compilation"></a>Compilación</h2></div></div><div></div></div><p><a name="BId-install-free-software-chapter-pa96"></a>Ahora que el software está configurado correctamente, sólo falta compilarlo. Generalmente esta parte es fácil, y no presenta problemas serios.</p><div class="sect2" lang="es"><div class="titlepage"><div><div><h3 class="title"><a name="make"></a>Make</h3></div></div><div></div></div><p><a name="BId-install-free-software-chapter-pa97"></a><a class="indexterm" name="BId-install-free-software-chapter-it5"></a><span><b class="command">make</b></span> es la herramienta favorita de la comunidad de software libre para compilar los fuentes. Tiene dos cosas interesantes:</p><div class="itemizedlist"><ul type="disc"><li><p><a name="BId-install-free-software-chapter-pa98"></a>le permite ganar tiempo al desarrollador, porque le permite administrar la compilación de su proyecto de manera eficiente,</p></li><li><p><a name="BId-install-free-software-chapter-pa99"></a>permite que el usuario final compile e instale el software en pocas líneas de comando, incluso si no tiene conocimientos preliminares de desarrollo.</p></li></ul></div><p><a name="BId-install-free-software-chapter-pa100"></a>Las acciones a ejecutar para obtener una versión compilada de los fuentes generalmente se almacenan en un fichero denominado <tt class="filename">Makefile</tt> o <tt class="filename">GNUMakefile</tt>. De hecho, cuando se invoca a <span><b class="command">make</b></span>, este lee dicho fichero, si existe, en el directorio corriente. Si no es así, se puede especificar el fichero usando la opción <tt class="option">-f</tt> con <span><b class="command">make</b></span>.</p></div><div class="sect2" lang="es"><div class="titlepage"><div><div><h3 class="title"><a name="id2562578"></a>Reglas</h3></div></div><div></div></div><p><a name="BId-install-free-software-chapter-pa101"></a><span><b class="command">make</b></span> funciona de acuerdo a un sistema de <a name="BId-install-free-software-chapter-gt12" href="glossary.html#term-dependencies"><i class="glossterm">dependencias</i></a>, razón por la cual la compilación de un fichero binario (“<span class="quote"><a name="BId-install-free-software-chapter-gt13" href="glossary.html#term-target"><i class="glossterm">objetivo</i></a></span>”) necesita pasar por varias etapas (“<span class="quote">dependencias</span>”). Por ejemplo, para crear el fichero binario (imaginario) <tt class="filename">glloq</tt>, se deben compilar y luego vincular los ficheros objeto <tt class="filename">main.o</tt> e <tt class="filename">init.o</tt> (ficheros intermedios de la compilación). Estos ficheros objeto también son objetivos, cuyas dependencias son sus ficheros fuente correspondiente.</p><p><a name="BId-install-free-software-chapter-pa102"></a>Este texto sólo es una introducción mínima para sobrevivir en el mundo sin piedad de <span><b class="command">make</b></span>. Para una documentación exhaustiva, debe referirse a <i class="citetitle"><a name="BId-install-free-software-chapter-ct1"></a>Managing Projects with Make</i> (Administración de proyectos con Make), segunda edición, de <span class="emphasis"><em>O'Reilly</em></span>, por <i class="wordasword">Andrew</i> <i class="wordasword">Oram</i> y <i class="wordasword">Steve</i> <i class="wordasword">Talbott</i>.</p></div><div class="sect2" lang="es"><div class="titlepage"><div><div><h3 class="title"><a name="id2562723"></a>Go, go, go!</h3></div></div><div></div></div><p><a name="BId-install-free-software-chapter-pa103"></a>Por lo general, el uso de <span><b class="command">make</b></span> obedece a muchas convenciones. Por ejemplo:</p><div class="itemizedlist"><ul type="disc"><li><p><a name="BId-install-free-software-chapter-pa104"></a><span><b class="command">make</b></span> sin argumentos simplemente ejecuta la compilación del programa, sin instalarlo.</p></li><li><p><a name="BId-install-free-software-chapter-pa105"></a><span><b class="command">make install</b></span> compila el programa (aunque no siempre), y asegura la instalación de los ficheros necesarios en el lugar adecuado del sistema de ficheros. Algunos ficheros no siempre se instalan correctamente (<tt class="filename">man</tt>, <tt class="filename">info</tt>), ellos deben ser copiados por el usuario. Algunas veces, <span><b class="command">make install</b></span> tiene que volver a ser ejecutado en los subdirectorios. Por lo general, esto pasa con los módulos desarrollados por terceros.</p></li><li><p><a name="BId-install-free-software-chapter-pa106"></a><span><b class="command">make clean</b></span> borra todos los ficheros temporales creados por la compilación, y, en la mayoría de los casos, el fichero ejecutable.</p></li></ul></div><p><a name="BId-install-free-software-chapter-pa107"></a>La primera etapa para compilar un programa es ingresar (ejemplo imaginario):</p><a name="BId-install-free-software-chapter-sc14"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">$ make gcc -c glloq.c -o glloq.o gcc -c init.c -o init.o gcc -c main.c -o main.o gcc -lgtk -lgdk -lglib -lXext -lX11 -lm glloq.o init.o main.o -o glloq</pre></td></tr></table><p><a name="BId-install-free-software-chapter-pa108"></a>Excelente, el fichero binario está compilado correctamente. Ahora estamos preparados para la etapa siguiente, que es la instalación de los ficheros de la distribución (ficheros binarios, ficheros de datos, etc...) Consulte la sección <a href="install-free-installation.html" title="Instalación">“Instalación”</a>.</p></div><div class="sect2" lang="es"><div class="titlepage"><div><div><h3 class="title"><a name="id2562889"></a>Explicaciones</h3></div></div><div></div></div><p><a name="BId-install-free-software-chapter-pa109"></a><a class="indexterm" name="BId-install-free-software-chapter-it6"></a>Si Usted es lo suficientemente curioso para mirar el fichero <tt class="filename">Makefile</tt>, encontrará comandos conocidos (<span><b class="command">rm</b></span>, <span><b class="command">mv</b></span>, <span><b class="command">cp</b></span>, ...), aunque también encontrará algunas cadenas extrañas, de la forma <tt class="varname">$(CFLAGS)</tt>.</p><p><a name="BId-install-free-software-chapter-pa110"></a>Estas son <span class="emphasis"><em><a name="BId-install-free-software-chapter-gt14" href="glossary.html#term-variables"><i class="glossterm">variables</i></a></em></span>, es decir las cadenas que generalmente se fijan al comienzo del fichero <tt class="filename">Makefile</tt>, y luego se reemplazan por el valor con el cual están asociadas. Esto es bastante útil cuando quiere usar las mismas opciones de compilación varias veces a la vez.</p><p><a name="BId-install-free-software-chapter-pa111"></a>Por ejemplo, puede mostrar la cadena “<span class="quote"><tt class="literal">pepe</tt></span>” en la pantalla usando <span><b class="command">make all</b></span>:</p><a name="BId-install-free-software-chapter-sc15"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen"> TEST = pepe all: echo $(TEST)</pre></td></tr></table><p><a name="BId-install-free-software-chapter-pa112"></a>La mayoría de las veces, se definen las variables siguientes:</p><div class="orderedlist"><ol type="1"><li><p><a name="BId-install-free-software-chapter-pa113"></a><tt class="varname">CC</tt>: este es el compilador que va a utilizar. Generalmente es <span><b class="command">cc1</b></span>, que en la mayoría de los sistemas libres, es sinónimo de <span><b class="command">gcc</b></span>. Cuando tenga dudas, ponga aquí <span><b class="command">gcc</b></span>.</p></li><li><p><a name="BId-install-free-software-chapter-pa114"></a><tt class="varname">LD</tt>: este es el programa usado para asegurar la fase de la compilación final (consulte la sección <a href="ch12s01.html#steps" title="Las cuatro fases de la compilación">“Las cuatro fases de la compilación”</a>) El valor predeterminado es <span><b class="command">ld</b></span>.</p></li><li><p><a name="BId-install-free-software-chapter-pa115"></a><tt class="varname">CFLAGS</tt>: estos son los argumentos adicionales que se pasarán al compilador durante las primeras etapas de la compilación. Entre ellos:</p><div class="itemizedlist"><ul type="disc"><li><p><a name="BId-install-free-software-chapter-pa116"></a><tt class="option">-I<ruta></tt>: le especifica al compilador donde buscar algunos ficheros de encabezado adicionales (por ejemplo: <tt class="option">-I/usr/X11R6/include</tt> permite incluir los ficheros de encabezado que están en el directorio <tt class="filename">/usr/X11R6/include</tt>)</p></li><li><p><a name="BId-install-free-software-chapter-pa117"></a><tt class="option">-D<símbolo></tt>: define un símbolo adicional, útil para los programas cuya compilación depende de los símbolos definidos (ejemplo: utilizar el fichero <tt class="filename">string.h</tt> si está definida <tt class="varname">HAVE_STRING_H</tt>)</p></li></ul></div><p><a name="BId-install-free-software-chapter-pa118"></a>Generalmente hay líneas de compilación de la forma:</p><a name="BId-install-free-software-chapter-sc16"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">$(CC) $(CFLAGS) -c pepe.c -o pepe.o</pre></td></tr></table></li><li><p><a name="BId-install-free-software-chapter-pa119"></a><tt class="varname">LDFLAGS</tt> (o <tt class="varname">LFLAGS</tt>): estos son los argumentos que se usan durante la última etapa de compilación. Entre ellos:</p><div class="itemizedlist"><ul type="disc"><li><p><a name="BId-install-free-software-chapter-pa120"></a><tt class="option">-L<ruta></tt>: especifica una ruta adicional donde buscar bibliotecas (por ejemplo: <tt class="option">-L/usr/X11R6/lib</tt>)</p></li><li><p><a name="BId-install-free-software-chapter-pa121"></a><tt class="option">-l<biblioteca></tt>: especifica una biblioteca adicional para usar durante la última etapa de compilación.</p></li></ul></div></li></ol></div></div><div class="sect2" lang="es"><div class="titlepage"><div><div><h3 class="title"><a name="it-does-not-work"></a>¿Qué pasa si... no funciona?</h3></div></div><div></div></div><p><a name="BId-install-free-software-chapter-pa122"></a>No tenga pánico, le puede pasar a cualquiera. Entre las causas más comunes:</p><div class="orderedlist"><ol type="1"><li><p><a name="BId-install-free-software-chapter-pa123"></a><tt class="literal">glloq.c:16: decl.h: No such file or directory</tt> (<tt class="literal">glloq.c :16</tt>: <tt class="literal">decl.h</tt>: no hay fichero o directorio con ese nombre)</p><p><a name="BId-install-free-software-chapter-pa124"></a>El compilador no pudo encontrar el fichero de encabezado correspondiente. Por lo tanto, la etapa de configuración del software debería haber anticipado este error. Cómo resolver este problema:</p><div class="itemizedlist"><ul type="disc"><li><p><a name="BId-install-free-software-chapter-pa125"></a>verifique que verdaderamente exista el fichero de encabezado en cuestión en uno de los directorios siguientes: <tt class="filename">/usr/include</tt>, <tt class="filename">/usr/local/include</tt>, <tt class="filename">/usr/X11R6/include</tt> o en alguno de sus subdirectorios. De no ser así, búsquelo por todo el disco (con <span><b class="command">find</b></span> o <span><b class="command">locate</b></span>), y, si todavía no lo encuentra, verifique que ha instalado la biblioteca de desarrollo correspondiente a este fichero de encabezado. Puede encontrar ejemplos de los comandos <span><b class="command">find</b></span> y <span><b class="command">locate</b></span> en las respectivas páginas Man.</p></li><li><p><a name="BId-install-free-software-chapter-pa126"></a>Verifique que el fichero de encabezado se pueda leer (para verificarlo, puede ingresar <span><b class="command">less <ruta>/<fichero>.h</b></span>)</p></li><li><p><a name="BId-install-free-software-chapter-pa127"></a>Si es un directorio como <tt class="filename">/usr/local/include</tt> o como <tt class="filename">/usr/X11R6/include</tt>, Usted tiene que agregar, a veces, un argumento nuevo al compilador. Abra el fichero <tt class="filename">Makefile</tt> correspondiente (tenga cuidado de abrir el fichero correcto, los que se encuentran en el directorio donde falla la compilación<sup>[<a name="id2563472" href="#ftn.id2563472">36</a>]</sup>) con su editor de texto favorito (<span class="application">Emacs</span>, <span class="application">Vi</span>, etc) Busque la línea errónea, y agregue la cadena <tt class="option">-I<ruta></tt>, donde <tt class="option"><ruta></tt> es la ruta donde se puede encontrar el fichero de encabezado en cuestión, justo después de la llamada del compilador (<tt class="literal">gcc</tt>, o, a veces, <tt class="literal">$(CC)</tt>) Si no sabe donde agregar esta opción, agréguela al comienzo del fichero, después de <tt class="literal">CFLAGS=<algo></tt> o después de <tt class="literal">CC=<algo></tt>.</p></li><li><p><a name="BId-install-free-software-chapter-pa129"></a>ejecute <span><b class="command">make</b></span> de nuevo, y si todavía sigue sin funcionar, verifique que esta opción (ver el punto anterior) se agrega durante la compilación en la línea errónea.</p></li><li><p><a name="BId-install-free-software-chapter-pa130"></a>si todavía sigue sin funcionar, pida ayuda al autor del software, a su gurú local, o a la comunidad de software libre para resolver su problema (consulte la sección <a href="install-free-support.html#support" title="Soporte técnico">“Soporte técnico”</a>)</p></li></ul></div></li><li><p><a name="BId-install-free-software-chapter-pa131"></a><tt class="literal">glloq.c:28: `struct pepe' undeclared (first use this function)</tt> (<tt class="literal">glloq.c:28</tt>: “<span class="quote"><tt class="literal">struct pepe</tt></span>” no está declarada (esta es la primera utilización en esta función))</p><p><a name="BId-install-free-software-chapter-pa132"></a>Las estructuras son tipos de datos especiales, que usan todos los programas. El sistema define un montón de ellas en los ficheros de encabezados. Eso significa que es muy probable que el problema sea la falta o el mal uso de un fichero de encabezado. El procedimiento correcto para resolver el problema es:</p><div class="itemizedlist"><ul type="disc"><li><p><a name="BId-install-free-software-chapter-pa133"></a>intente verificar si la estructura en cuestión es una estructura definida por el programa o por el sistema. Una solución es usar el comando <span class="application">grep</span> para ver si la estructura está definida en alguno de los ficheros de encabezado.</p><p><a name="BId-install-free-software-chapter-pa134"></a>Por ejemplo, cuando Usted está en la raíz de la distribución:</p><a name="BId-install-free-software-chapter-sc17"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">$ find . -name '*.h'| xargs grep 'struct pepe' | less</pre></td></tr></table><p><a name="BId-install-free-software-chapter-pa135"></a>Es posible que aparezcan muchas líneas en la pantalla (por ejemplo, cada vez que se define una función que use esta estructura) Elija, si existe, la línea donde se define la estructura mirando el fichero de encabezado obtenido por la utilización del comando <span class="application">grep</span>.</p><p><a name="BId-install-free-software-chapter-pa136"></a>La definición de una estructura es:</p><a name="BId-install-free-software-chapter-sc18"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen"> struct pepe { <contenido de la estructura pepe> }; </pre></td></tr></table><p><a name="BId-install-free-software-chapter-pa137"></a>Verifique si ella corresponde a lo que Usted tiene. De ser así, eso significa que no se incluye el encabezado en el fichero <tt class="filename">.c</tt> erróneo. Hay dos soluciones:</p><div class="itemizedlist"><ul type="circle"><li><p><a name="BId-install-free-software-chapter-pa138"></a>agregar la línea <tt class="option">#include "<nombre_de_fichero>.h"</tt> al comienzo del fichero <tt class="filename">.c</tt> erróneo.</p></li><li><p><a name="BId-install-free-software-chapter-pa139"></a>o copiar y pegar la definición de la estructura al comienzo del fichero <tt class="filename">.c</tt> (esto no es de lo mejor, pero al menos por lo general, funciona)</p></li></ul></div></li><li><p><a name="BId-install-free-software-chapter-pa140"></a>si este no es el caso, haga lo mismo con los ficheros de encabezado del sistema (que, generalmente, se encuentran en los directorios siguientes: <tt class="filename">/usr/include</tt>, <tt class="filename">/usr/X11R6/include</tt> y <tt class="filename">/usr/local/include</tt>) Pero en este caso, use la línea <tt class="literal">#include <<nombre_de_fichero>.h></tt>.</p></li><li><p><a name="BId-install-free-software-chapter-pa141"></a>si todavía no existe esta estructura, intente encontrar en que biblioteca (es decir, conjunto de funciones agrupadas en un solo paquete) debería estar definida (ver en el fichero <tt class="filename">INSTALL</tt> o <tt class="filename">README</tt> cuales son las bibliotecas que usa este programa y las versiones necesarias) Si la versión que necesita el programa no está instalada en el sistema, Usted deberá actualizar esta biblioteca. Cabe destacar que debe tener sumo cuidado al manipular los ficheros de encabezado del sistema, ya que estos son comunes a muchos programas.</p></li><li><p><a name="BId-install-free-software-chapter-pa142"></a>si todavía sigue sin funcionar, verifique que el programa funciona adecuadamente sobre su arquitectura (algunos programas todavía no han sido portados a todos los sistemas <span class="application">UNIX</span>) Verifique también que ha configurado el programa correctamente (por ejemplo, cuando ejecutó <span><b class="command">configure</b></span>) para su arquitectura.</p></li></ul></div></li><li><p><a name="BId-install-free-software-chapter-pa143"></a><tt class="literal">parse error</tt> (error de análisis sintáctico)</p><p><a name="BId-install-free-software-chapter-pa144"></a>Este es un problema que es relativamente complicado de resolver, porque generalmente es un error que aparece en cierta línea, pero después que el compilador lo encontró. A veces, es simplemente un tipo de datos que no está definido. Si Usted encuentra un mensaje de error del tipo:</p><a name="BId-install-free-software-chapter-sc19"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen"> main.c:1: parse error before `glloq_t main.c:1: warning: data definition has no type or storage class </pre></td></tr></table><p><a name="BId-install-free-software-chapter-pa145"></a>entonces el problema es que el tipo <tt class="literal">glloq_t</tt> no está definido. La solución al problema es más o menos la misma que en el problema anterior.</p><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><table border="0" summary="Note"><tr><td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="images/note.png"></td><th align="left">Nota</th></tr><tr><td colspan="2" align="left" valign="top"><p><a name="BId-install-free-software-chapter-pa146"></a>puede haber un error del tipo <tt class="literal">parse error</tt> en las bibliotecas <tt class="filename">curses</tt> antiguas si la memoria no nos falla.</p></td></tr></table></div></li><li><p><a name="BId-install-free-software-chapter-pa147"></a><tt class="literal">no space left on device</tt> (no queda espacio en el dispositivo)</p><p><a name="BId-install-free-software-chapter-pa148"></a>Este problema es simple de resolver: no hay espacio suficiente en el disco para generar un fichero binario a partir del fichero fuente. La solución consiste en liberar espacio en la partición que contiene el directorio de instalación (borrar ficheros innecesarios, ficheros temporales, desinstalar programas que no use). Si descomprimió en <tt class="filename">/tmp</tt>, mejor hágalo en <tt class="filename">/usr/local/src</tt> que evita la saturación innecesaria de la partición <tt class="filename">/tmp</tt>. Verifique si hay <i class="glossterm"><a name="BId-install-free-software-chapter-gt15"></a>ficheros <tt class="filename">core</tt></i><sup>[<a name="id2564115" href="#ftn.id2564115">37</a>]</sup> en su disco. De ser así, elimínelos o haga que el usuario al cual pertenezcan los elimine.</p></li><li><p><a name="BId-install-free-software-chapter-pa150"></a><tt class="literal">/usr/bin/ld: cannot open -lglloq: No such file or directory</tt> (<tt class="literal">/usr/bin/ld: no puedo abrir -lglloq: no hay fichero o directorio alguno con ese nombre</tt>).</p><p><a name="BId-install-free-software-chapter-pa151"></a>Esto significa claramente que el programa <span><b class="command">ld</b></span> (usado por <span><b class="command">gcc</b></span> durante la última etapa de la compilación) no puede encontrar una biblioteca. Para incluir una biblioteca, <span><b class="command">ld</b></span> busca un fichero cuyo nombre está en los argumentos del tipo <tt class="option">-l<biblioteca></tt>. Este fichero es <tt class="option">lib<biblioteca.so></tt>. Si <span><b class="command">ld</b></span> no puede encontrarlo, produce un mensaje de error. Para resolver el problema, siga los pasos que se indican a continuación:</p><div class="orderedlist"><ol type="a"><li><p><a name="BId-install-free-software-chapter-pa152"></a>verifique que el fichero existe en el disco rígido usando el comando <span><b class="command">locate</b></span>. Por lo general, las bibliotecas gráficas se encuentran en <tt class="filename">/usr/X11R6/lib</tt>. Por ejemplo:</p><a name="BId-install-free-software-chapter-sc20"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">$ locate libglloq</pre></td></tr></table><p><a name="BId-install-free-software-chapter-pa153"></a>Si la búsqueda no tiene resultado, puede buscar con el comando <span><b class="command">find</b></span> (ejemplo: <span><b class="command">find /usr -name "libglloq.so*"</b></span>) Si Usted no puede encontrar la biblioteca, entonces tendrá que instalarla.</p></li><li><p><a name="LD-LIBRARY-PATH"></a><a name="BId-install-free-software-chapter-pa154"></a>una vez que está localizada la biblioteca, verifique que <span><b class="command">ld</b></span> puede accederla: el fichero que especifica donde encontrar estas bibliotecas es <tt class="filename">/etc/ld.so.conf</tt>. Agregue el directorio en cuestión al final del mismo y ejecute <span><b class="command">ldconfig</b></span>. También puede agregar este directorio a la variable de entorno <tt class="varname">LD_LIBRARY_PATH</tt>. Por ejemplo, si el directorio a agregar es <tt class="filename">/usr/X11R6/lib</tt>, ingrese:</p><a name="BId-install-free-software-chapter-sc21"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/X11R6/lib</pre></td></tr></table><p><a name="BId-install-free-software-chapter-pa155"></a>(si su shell es <span class="application">bash</span>)</p></li><li><p><a name="BId-install-free-software-chapter-pa156"></a>si todavía no funciona, verifique que el formato de la biblioteca en cuestión es un fichero ejecutable (o <span class="acronym">ELF</span>) (con el comando <span><b class="command">file</b></span>) Si esta es un vínculo simbólico, verifique que el vínculo es correcto y no apunta a un fichero inexistente (por ejemplo, con <span><b class="command">nm <lib></b></span>). Los permisos pueden ser erróneos (por ejemplo, Usted usa una cuenta que no es <tt class="literal">root</tt> y la biblioteca está protegida contra lectura).</p></li></ol></div></li><li><p><a name="BId-install-free-software-chapter-pa157"></a><tt class="literal">glloq.c(.text+0x34): undefined reference to `<tt class="filename">glloq_init</tt>'</tt> (<tt class="literal">glloq.c(.text+0x34)</tt>: referencia indefinida al símbolo `<tt class="filename">glloq_init</tt>')</p><p><a name="BId-install-free-software-chapter-pa158"></a>Esto significa que no se resolvió un símbolo durante la última etapa de la compilación. Por lo general, este es un problema de biblioteca. Puede haber varias causas:</p><div class="itemizedlist"><ul type="disc"><li><p><a name="BId-install-free-software-chapter-pa159"></a>la primera cosa a hacer es saber si se <span class="emphasis"><em>supone</em></span> que el símbolo esté presente en una biblioteca. Por ejemplo, si es un símbolo que comienza por <tt class="literal">gtk</tt>, pertenece a la biblioteca <tt class="literal">gtk</tt>. Si el nombre de la biblioteca es difícil de identificar (como por ejemplo, <tt class="filename">zorglub_gloubiboulga</tt>), se pueden listar los símbolos de una biblioteca con el comando <span><b class="command">nm</b></span>. Por ejemplo,</p><a name="BId-install-free-software-chapter-sc22"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">$ nm libglloq.so 0000000000109df0 d glloq_message_func 000000000010a984 b glloq_msg 0000000000008a58 t glloq_nearest_pow 0000000000109dd8 d glloq_free_list 0000000000109cf8 d glloq_mem_chunk</pre></td></tr></table><p><a name="BId-install-free-software-chapter-pa160"></a>Agregar la opción <tt class="option">-o</tt> a <span><b class="command">nm</b></span> permite mostrar el nombre de la biblioteca en cada línea, lo cual facilita la búsqueda. Imaginemos que buscamos el símbolo <tt class="literal">bulgroz_max</tt>, una solución cruda es realizar una búsqueda del tipo:</p><a name="BId-install-free-software-chapter-sc23"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">$ nm /usr/lib/lib*.so | grep bulgroz_max $ nm /usr/X11R6/lib/lib*.so | grep bulgroz_max $ nm /usr/local/lib/lib*.so | grep bulgroz_max /usr/local/lib/libfrobnicate.so:000000000004d848 T bulgroz_max</pre></td></tr></table><p><a name="BId-install-free-software-chapter-pa161"></a>¡Formidable! El símbolo <tt class="literal">bulgroz_max</tt> está definido en la biblioteca <tt class="filename">zorglub</tt> (la letra mayúscula <tt class="literal">T</tt> se encuentra delante de su nombre) Entonces, Usted sólo tiene que agregar la cadena <tt class="literal">-lzorglub</tt> en la línea de compilación editando el fichero <tt class="filename">Makefile</tt>: agréguela al final de la línea donde se define la variable <tt class="varname">LDFLAGS</tt> o <tt class="varname">LFGLAGS</tt> (o, en el peor de los casos, <tt class="varname">CC</tt>), o en la línea correspondiente a la creación del fichero binario final.</p></li><li><p><a name="BId-install-free-software-chapter-pa162"></a>la compilación está hecha con una versión de la biblioteca que no es la que permite el software. Lea el fichero <tt class="filename">README</tt> o <tt class="filename">INSTALL</tt> de la distribución para saber que versión de la biblioteca debe usar.</p></li><li><p><a name="BId-install-free-software-chapter-pa163"></a>no todos los ficheros objeto de la distribución están vinculados correctamente. Falta, o no se menciona, el fichero donde está definida esta función. Ingrese <span><b class="command">nm -o *.o</b></span>, para saber el nombre del fichero <tt class="filename">.o</tt> correspondiente y agréguelo en la línea de compilación si es que falta.</p></li><li><p><a name="BId-install-free-software-chapter-pa164"></a>la función o variable en cuestión puede ser fantasiosa. Intente eliminarla: edite el fichero fuente en cuestión (el nombre del mismo se especifica al comienzo del mensaje de error) Esta es una solución desesperada cuya consecuencia ciertamente será un funcionamiento anárquico del software (<i class="glossterm"><a name="BId-install-free-software-chapter-gt16"></a>error de segmentación</i> en el arranque, etc.)</p></li></ul></div></li><li><p><a name="BId-install-free-software-chapter-pa165"></a><tt class="literal">Segmentation fault (core dumped)</tt> (Error de segmentación (se produjo un fichero <tt class="filename">core</tt>)).</p><p><a name="BId-install-free-software-chapter-pa166"></a>A veces, el compilador se cuelga lamentablemente y produce este mensaje de error. No tengo consejo alguno, salvo pedirle que instale una versión más reciente de su compilador.</p></li><li><p><a name="BId-install-free-software-chapter-pa167"></a>no queda espacio en <tt class="filename">/tmp</tt></p><p><a name="BId-install-free-software-chapter-pa168"></a>La compilación necesita espacio temporal durante las diferentes etapas; si no tiene espacio suficiente, falla. Por lo tanto, debe limpiar la partición, pero debe tener cuidado ya que algunos programas en curso de ejecución (servidor <span class="application">X</span>, tuberías...) se pueden colgar si se borran algunos ficheros. ¡Usted debe saber lo que está haciendo! Si <tt class="filename">tmp</tt> es parte de una partición que no la contiene solamente (por ejemplo, la raíz), busque y borre algunos ficheros <tt class="filename">core</tt> eventuales.</p></li><li><p><a name="BId-install-free-software-chapter-pa169"></a><span><b class="command">make</b></span> / <span><b class="command">configure</b></span> en bucle infinito</p><p><a name="BId-install-free-software-chapter-pa170"></a>Generalmente, esto es un problema de la hora en su sistema. En efecto, <span><b class="command">make</b></span> necesita saber la fecha y la hora de la computadora y de los ficheros que verifica. Este compara las fechas de los ficheros y usa el resultado para saber si el objetivo es más reciente que la dependencia.</p><p><a name="BId-install-free-software-chapter-pa171"></a>Algunos problemas en la fecha pueden inducir a <span><b class="command">make</b></span> a reconstruirse a sí mismo indefinidamente (o a construir y reconstruir un subárbol en bucle) Si es así, el uso del comando <span><b class="command">touch</b></span> (cuya consecuencia es poner en la hora corriente a los ficheros pasados como argumento) resuelve el problema la mayoría de las veces.</p><p><a name="BId-install-free-software-chapter-pa172"></a>Por ejemplo:</p><a name="BId-install-free-software-chapter-sc24"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">$ touch *</pre></td></tr></table><p><a name="BId-install-free-software-chapter-pa173"></a>O también (más bruto, pero eficiente):</p><a name="BId-install-free-software-chapter-sc25"></a><table border="0" bgcolor="#E0E0E0"><tr><td><pre class="screen">$ find . | xargs touch</pre></td></tr></table></li></ol></div></div><div class="footnotes"><br><hr width="100" align="left"><div class="footnote"><p><sup>[<a name="ftn.id2563472" href="#id2563472">36</a>] </sup>Analice el mensaje de error que devuelve <span><b class="command">make</b></span>. Normalmente, las últimas líneas deberían contener un directorio (un mensaje como <tt class="literal">make[1]: Leaving directory `/home/reina/Proyecto/pepe'</tt>). Elija aquel que tiene el número más grande. Para verificar que es el bueno, vaya al directorio y ejecute <span><b class="command">make</b></span> de nuevo para obtener el mismo error.</p></div><div class="footnote"><p><sup>[<a name="ftn.id2564115" href="#id2564115">37</a>] </sup>Fichero generado por el sistema cuando un proceso intenta acceder a una ubicación de memoria a la cual no tiene permiso para acceder. Estos archivos se utilizan para analizar la razón de tal comportamiento para corregir el problema.</p></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="install-free-config.html">Anterior</a> </td><td width="20%" align="center"><a accesskey="u" href="install-free-software-chapter.html">Subir</a></td><td width="40%" align="right"> <a accesskey="n" href="install-free-installation.html">Siguiente</a></td></tr><tr><td width="40%" align="left" valign="top">Configuración </td><td width="20%" align="center"><a accesskey="h" href="index.html">Inicio</a></td><td width="40%" align="right" valign="top"> Instalación</td></tr></table></div></body></html>