<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Tras unas cuantas pruebas y una idea feliz, porque me dejaba una cosa ya he conseguido hacerlo que vea la librería.<div><br></div><div>Muchas gracias por vuestras respuestas me han sido de gran ayuda.</div><div><br><div><div>On 16/05/2010, at 3:24, Steven Davidson wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">Hola Jorge,<br><br> <div class="gmail_quote">2010/5/15 Jorge Vega Sanchez <span dir="ltr"><<a href="mailto:memmaker650@gmail.com">memmaker650@gmail.com</a>></span><br> <blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote"> <div style="WORD-WRAP: break-word">Vale. Bueno se me había olvidado que trabajo en entonro Linux/Unix, enc oncreto MAC.  <div>Ya he seguido tus consejos y he quitado el fichero .h del comando de compilación.</div> <div>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.</div> <div><br></div> <div>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/</div></div></blockquote> <div> </div> <div>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.</div> <div> </div> <div>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:</div> <div>-Ldir  buscará en "dir" las bibliotecas indicadas por la opción -l, y</div> <div>-Idir  buscará en "dir" los ficheros de cabecera</div> <div> </div> <blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote"> <div style="WORD-WRAP: break-word"> <div>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.</div></div></blockquote> <blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote"> <div style="WORD-WRAP: break-word"> <div>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.</div></div></blockquote> <div> </div> <div>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.</div> <div> </div> <div>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,</div> <div> </div> <div>// "cabecera.h"</div> <div>int func( int );</div> <div> </div> <div> <div> </div> <div> <div>// "cabecera2.h"</div> <div>struct algo { int x,y,z; };</div> <div> </div>int func2( const algo & );</div></div> <div> </div> <div>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.</div> <div> </div> <blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote"> <div style="WORD-WRAP: break-word"> <div>Mi duda es:</div> <div><span style="WHITE-SPACE: pre"></span>- 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  ???</div> <div> </div></div></blockquote> <div> </div> <div>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,</div> <div> </div> <div>g++ funciones.cpp prueba.cpp -o prueba -I/Users/jorgevegasanchez/xxx/yyy/</div> <div> </div> <div> </div> <blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote"> <div style="WORD-WRAP: break-word"> <div><span style="WHITE-SPACE: pre"></span>- 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.</div> <div><br></div> <div>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.</div> <div><br></div></div></blockquote> <div> </div> <div> </div> <div> </div> <div>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.</div> <div> </div> <div> </div> <blockquote style="BORDER-LEFT: #ccc 1px solid; MARGIN: 0px 0px 0px 0.8ex; PADDING-LEFT: 1ex" class="gmail_quote"> <div style="WORD-WRAP: break-word"> <div><br></div> <div>Ahora otra duda.</div> <div><br></div> <div>Las librerías hay que incluirlas en el compilado, en el linkado o en ambos ???</div> <div> </div></div></blockquote> <div> </div> <div> </div> <div>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.</div> <div> </div> <div> </div> <div>Espero haber aclarado las dudas.</div> <div> </div> <div>Steven</div></div> _______________________________________________<br>Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net">Cconclase@listas.conclase.net</a><br><a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a></blockquote></div><br></div></body></html>