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

Jorge Vega Sanchez memmaker650 en gmail.com
Mar Mayo 18 10:32:55 CEST 2010


Tras unas cuantas pruebas y una idea feliz, porque me dejaba una cosa  
ya he conseguido hacerlo que vea la librería.

Muchas gracias por vuestras respuestas me han sido de gran ayuda.

On 16/05/2010, at 3:24, Steven Davidson wrote:

> 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
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ

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


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