Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: SrCooper en 15 Junio 2013, 22:57 pm



Título: Incluir archivos de cabecera
Publicado por: SrCooper en 15 Junio 2013, 22:57 pm
He creado una serie de archivos de cabecera para mis proyectos en c++ y hasta ahora si queria incluirlos en mi codigo debia teclear:
Código
  1. #include "nombre.h"
e incluir los archivos en la carpeta de mi proyecto. Pero resulta engorroso tener que copiar y compilar siempre los archivos cada vez asi que me gustaria saber donde tengo que copiar los archivos de cabecera para poder escribirlo asi:
Código
  1. #include <nombre.h>
y no tener que copiar siempre los archivos. Es decir, me gustaria convertir mi cabecera en una libreria normal.
He buscado informacion en google y en el foro pero no he encontrado nada que solucione mi problema. Uso linux, el compilador gcc y emacs.
Un saludo y gracias por adelantado.


Título: Re: Incluir archivos de cabecera
Publicado por: amchacon en 15 Junio 2013, 23:27 pm
(http://www.forodefotos.com/attachments/series/15807d1293601667-leonard-de-big-bang-theory-leonard-big-bang-theory-posando.jpg)

Deberías estar trabajando en la teoría de cuerdas y no programando. Eso es cosa de ingenieros  ;-)

Cuando tu escribes <>, el compilador busca en la carpeta "include". Está dentro de la carpeta del compilador.

También puedes decirle al compilador que añada a su base de datos un determinado directorio.. En Codeblocks puedes configurarlo para que lo haga en todos los proyectos (o te haces una plantilla específica). Seguramente (casi 100%) emacs también lo permita (es algo bastante básico).


Título: Re: Incluir archivos de cabecera
Publicado por: 0xDani en 15 Junio 2013, 23:55 pm
En Linux, el compilador buscará en una serie de directorios estandarizados, entre ellos:

  • /usr/include
  • /usr/local/include

Pon tu cabecera ahí. Si además has creado una librería estática o dinámica puedes ponerla en:

  • /usr/lib
  • /usr/local/lib

y enlazar con ella con la opción "-l" de gcc.

PD: Necesitarás privilegios para escribir en esos directorios.


Título: Re: Incluir archivos de cabecera
Publicado por: SrCooper en 16 Junio 2013, 14:45 pm
Deberías estar trabajando en la teoría de cuerdas y no programando. Eso es cosa de ingenieros  ;-)

En realidad es una duda para Howard. Evidentemente yo ya lo se  :P

Ahora en serio, copie los archivos de cabecera a la carpeta /usr/include pero me sigue dando error al compilar.

En Codeblocks puedes configurarlo para que lo haga en todos los proyectos (o te haces una plantilla específica).Seguramente (casi 100%) emacs también lo permita (es algo bastante básico).

Si seguramente sí pero no es eso lo que me interesa. Estuve probando a copiar la cabecera en distintos directorios pero de verdad que no encuentro que hacer. Alomejor estoy compilando mal o algo asi (aun soy bastante inexperto).
Un saludo

PD: Si al final no encuentro solucion pues crearé una plantilla y ya está.


Título: Re: Incluir archivos de cabecera
Publicado por: 0xDani en 16 Junio 2013, 14:48 pm
Qué errores te da? Porque así a ciegas es difícil ayudarte.


Título: Re: Incluir archivos de cabecera
Publicado por: pacoperico en 16 Junio 2013, 14:53 pm
Prueba una cosa busca los archivos de cabecera de la libreria estandar, mira a ver en que carpeta tienes alojados los stdio.h, string.h, stdlib.h, math.h etc etc. Y ahi sera donde debas poner tus bibliotecas personales.


Título: Re: Incluir archivos de cabecera
Publicado por: 0xDani en 16 Junio 2013, 16:26 pm
Prueba una cosa busca los archivos de cabecera de la libreria estandar, mira a ver en que carpeta tienes alojados los stdio.h, string.h, stdlib.h, math.h etc etc. Y ahi sera donde debas poner tus bibliotecas personales.

Ese directorio suele ser /usr/include, tal como he dicho más arriba. Sería bastante raro que en su ordenador fuese otro directorio.


Título: Re: Incluir archivos de cabecera
Publicado por: pacoperico en 16 Junio 2013, 17:08 pm
Asi es pero como el compañero ya ha puesto sus archivos *.h en ese directorio y sigue sin poder incluirlos en su codigo, lo unico que se me ocurre es que la carpeta include del compilador este en otro sitio o tenga otro nombre por la razon que sea.


Título: Re: Incluir archivos de cabecera
Publicado por: SrCooper en 16 Junio 2013, 19:51 pm
Código:
g++ -o main main.cpp
/usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
/tmp/cclBSM8A.o: In function `_main_()':
main.cpp:(.text+0x14): undefined reference to `miniwin::vredimensiona(int, int)'
main.cpp:(.text+0x39): undefined reference to `miniwin::rectangulo(float, float, float, float)'
main.cpp:(.text+0x76): undefined reference to `miniwin::texto(float, float, std::string const&)'
main.cpp:(.text+0x93): undefined reference to `miniwin::refresca()'
collect2: error: ld returned 1 exit status

Esto son los errores que da cuando intento compilar el archivo main.cpp, en el que se llaman a diferentes funciones citadas en los archivos de cabecera. Al parecer no reconoce estas funciones.
He copiado las cabeceras en el /usr/include y en la carpeta del compilador y en el codigo escribi #include <cabecera.h>. La verdad es que no se si estoy haciendo algo mal soy bastante novato programando. Alomejor estoy teniendo algun fallo tonto.

Si sirve de ayuda los archivos de cabecera en este caso son parte de un conjunto de funciones llamadas MiniWin creadas por Pau Fernández para el dibujo de diversas imagenes en consola.
Un saludo


Título: Re: Incluir archivos de cabecera
Publicado por: 0xDani en 16 Junio 2013, 21:43 pm
Vale, los errores son en tiempo de enlazado, lo que significa que el compilador encuentra las cabeceras. La pregunta es: hay archivos de implementación, aparte de las cabeceras? o librerías estáticas o dinámicas?

Porque lo que no encuentra el compilador es la definición de esas funciones.


Título: Re: Incluir archivos de cabecera
Publicado por: SrCooper en 16 Junio 2013, 23:02 pm
Sí tambien hay un archivo de implementacion de extension .cpp
¿Dónde tiene que estar ese archivo?


Título: Re: Incluir archivos de cabecera
Publicado por: amchacon en 16 Junio 2013, 23:07 pm
Sí tambien hay un archivo de implementacion de extension .cpp
¿Dónde tiene que estar ese archivo?
Compilalos (por separado) y copialos a la carpeta lib


Título: Re: Incluir archivos de cabecera
Publicado por: 0xDani en 17 Junio 2013, 13:25 pm
Compilalos (por separado) y copialos a la carpeta lib

Exacto, compilas el archivo .cpp, por ejemplo así para crear una librería dinámica:

Código
  1. gcc -c -fPIC archivo.cpp -o archivo.o
  2. gcc -shared -fPIC archivo.o -o libarchivo.so
  3.  

Y pones libarchivo.so en /usr/lib. Después para compilar tu programa tienes que linkar con esa librería, así:

Código
  1. gcc main.cpp -o main -larchivo
  2.  

Saludos.


Título: Re: Incluir archivos de cabecera
Publicado por: SrCooper en 17 Junio 2013, 22:13 pm
Gracias por las respuestas, ahora da otro error pero se debe a un fallo en el archivo.cpp, estoy solucionandolo.

Un saludo.