[C con Clase] Duda código dividido en ficheros.

Steven Davidson srd4121 en njit.edu
Dom Mayo 16 03:24:02 CEST 2010


Hola Jorge,

2010/5/15 Jorge Vega Sanchez <memmaker650 en gmail.com>

> Vale. Bueno se me había olvidado que trabajo en entonro Linux/Unix, enc
> oncreto MAC.
> Ya he seguido tus consejos y he quitado el fichero .h del comando de
> compilación.
> El problema que tengo es que me salen error porque me dice que la librería
> que enlazo en mi programa es como si no estuviera visible. Es decir no ve
> los procedimientos definidos en la librería.
>
> La librería está hecha por un amigo y he tenido que "instalar" a mano el
> fichero libxxx.a en /usr/local/lib/ y el fichero de cabecera en
> /usr/local/include/
>

Esto no es la forma habitual de usar las bibliotecas al menos que decidas
que tal biblioteca y su fichero de cabecera son tan importantes como las
estándares. Típicamente, las bibliotecas que nosotros mismos creamos son
para que las usamos para un proyecto en particular, pero no para todos.

En este caso, colocamos ambos ficheros "localmente" en algún directorio a
modo de proyecto y luego indicamos al enlazador y compilador dónde
buscarlos. Usa las opciones del compilador:
-Ldir  buscará en "dir" las bibliotecas indicadas por la opción -l, y
-Idir  buscará en "dir" los ficheros de cabecera


>  Aquí hay otra peculiaridad. Mirando el fichero de cabecera de la librería
> tiene un #include "  " a otro fichero de cabecera (.h) que esta dentro del
> código fuente de la librería.
>
 Aquí creo que tengo un problema porque al mover los ficheros libxxx.a y el
> .h ha cambiado la ruta al otro fichero de cabecera.
>

Si se compiló correctamente, lo más seguro es que ese segundo fichero de
cabecera no sea necesario, porque se usó para crear la susodicha biblioteca.
Por lo tanto, en un principio, este segundo fichero de cabecera no tiene
relevancia con el uso de la biblioteca, sino con su creación.

Ahora bien, si las definiciones y declaraciones en el segundo fichero de
cabecera son necesarias para usar la biblioteca, entonces el compilador
necesita conocer este fichero de cabecera o al menos agrega las definiciones
y declaraciones al primero. Por ejemplo,

// "cabecera.h"
int func( int );


 // "cabecera2.h"
struct algo { int x,y,z; };

int func2( const algo & );

Aquí, necesitarías dejar constancia de la definición del tipo 'algo' y del
prototipo 'func2()'. Por lo tanto, debes incluir estas declaraciones y
definiciones para que el compilador las conozca.


>  Mi duda es:
> - La ruta para que enlace el segundo fichero de cabecera basta con que sea
> "/Users/jorgevegasanchez/xxx/ yyy7cabecera.h" o primero debo salir de
> include, local y usr y ponerlo así  #include
> "../../../Users/jorgevegasanchez/xxx/yyy/cabecera.h  ???
>
>

No es aconsejable tratar con las rutas en las directivas #include. Para
esto, indica la ruta en la opción -I al compilar. Por ejemplo,

g++ funciones.cpp prueba.cpp -o prueba -I/Users/jorgevegasanchez/xxx/yyy/



>  - Si el fichero de cabecera de la librería enlaza con otro fichero de
> cabecera. Si copio el contenido de este segundo fichero de cabecera dentro
> del primero se supone que ya estará todos los métodos definidos y no hará
> falta enlazar nada más.
>
> Porque sé supone segun tengo entendido que el fichero de cabecera lo que
> hace es definir los métodos que luego se desarrollan en el fichero libxxx.a,
> no hace falta tener nada más de la librería.
>
>


Ten cuidado con la terminología. Los ficheros de cabecera sirven para que se
puedan definir los tipos de datos y para declarar las funciones. Las
definiciones o implementaciones de las funciones están en la biblioteca. No
existe un enlazado entre ficheros de cabecera, excepto uno lógico; o sea, un
fichero de cabecera #incluye a otro, pero esto no tiene nada que ver con el
enlazador.



>
> Ahora otra duda.
>
> Las librerías hay que incluirlas en el compilado, en el linkado o en ambos
> ???
>
>


El enlazado es quien hace uso de las bibliotecas. El lenguaje puede
comunicarse con el enlazador, pero no hay un vocabulario muy extenso, que
digamos. El compilador suele pasar cualquier comunicación al enlazado
directamente, sin tomar muchas decisiones.


Espero haber aclarado las dudas.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20100516/ba15f7d2/attachment.html>


Más información sobre la lista de distribución Cconclase