Discussion:
Compilar en C con ficheros .h (linux)
(demasiado antiguo para responder)
acertijolandia
2003-11-18 11:46:21 UTC
Permalink
Hola

Estoy realizando un programa que contiene tres ficheros:
- principal.c (Código donde está el main)
- modulos.c (Código con una serie de funciones que utiliza el
anterior)
- modulos.h (cabeceras de las funciones y tipos de datos

Para linkarlos incluyo en principal.c la sentencia

#include "modulos.h"

y en modulos.c

#include "modulos.h"

Sin embargo, cuando intento compilar con:

gcc -c principal.c
gcc -o principal principal.o

me da error en la referencia a la funcion "noseque", la cual está en
el .h

También he probado a compilar con

gcc principal.c modulos.c -o principal

En este caso me compila pero, mi duda es, utiliza el .h a la hora de
compilar o coge directamente las funciones de módulos.c.

Gracias y un saludo :)
Pascal Bourguignon
2003-11-18 12:53:58 UTC
Permalink
Post by acertijolandia
Hola
- principal.c (Código donde está el main)
- modulos.c (Código con una serie de funciones que utiliza el
anterior)
- modulos.h (cabeceras de las funciones y tipos de datos
Para linkarlos incluyo en principal.c la sentencia
#include "modulos.h"
y en modulos.c
#include "modulos.h"
¿No ves una cierta diferencia entre "link" y "include"?

Lo que hacer '#include' es incluir en el .c las definiciones que hay
en el .h.

Para linkar, hay que usar el programa de linkar: ld.
Post by acertijolandia
gcc -c principal.c
gcc -o principal principal.o
me da error en la referencia a la funcion "noseque", la cual está en
el .h
gcc -c principal.c
gcc -c modulos.c
ld -o programa principal.o modulos.o

o:

gcc -o programa principal.o modulos.o

que el gcc llama ld automaticamente.
Post by acertijolandia
También he probado a compilar con
gcc principal.c modulos.c -o principal
Se puede hacer asi tambien, por los programas simples.
Post by acertijolandia
En este caso me compila pero, mi duda es, utiliza el .h a la hora de
compilar o coge directamente las funciones de módulos.c.
Si hace los dos.


No hay relación directa entre los .h y el linker.

Primero, los .h son procesados unicamente por el PRE-procesador
cpp. El compilador C no los ve para nada. El compilador C no sabe
nada de archivos, .c o .h, solamente conoce la unidad de compilación
que el pre-procesador le da.

Para ver lo que el compilador C ve:

gcc -E principal.c -o unidad-de-compilacion.c ; cat unidad-de-compilacion.c

Se podria compilar lo así:

gcc -c unidad-de-compilacion.c

Para ver lo que hay en el .o generado:

nm unidad-de-compilacion.o
nm principal.o
nm modulo.o

(Leer man nm y comprobar los codigos)

T o t = simbolo definido dentro del .o
U = "undefinido", habra que proveer el linker con otro archivo
con una definición por este simbolo.

El linker no necesita los .c or los .h para trabajar. Hay todo lo que
necesita en los .o y las bibliotecas.

Y despues del link, puedes ver lo que queda en el ejecutable con nm tambien.
--
__Pascal_Bourguignon__
http://www.informatimago.com/
acertijolandia
2003-11-20 08:41:14 UTC
Permalink
Gracias Pascal :)
pablo
2003-11-25 21:07:08 UTC
Permalink
Hola,

De la primera forma, no le dices al compilador dnde tienes implementada
la funcion "noseque". Para hacer la compilacion por partes deberias
hacer lo siguiente :


gcc -c principal.c /* el modulos.h lo usa aqui */
gcc -c modulos.c /* el modulos.h tb lo usa aqui */
gcc -o principal principal.o modulos.o

De la otra forma lo que estas haciendo es todo de un tiron:

gcc principal.c modulos.c -o principal

El .h lo utiliza en ambos casos para para saber si la llamada que se
hace desde principal a la funcion "noseque" esta siendo hecha con los
parametros correctos (lo compara con el prototipo encontrado en el .h)
Post by acertijolandia
Hola
- principal.c (Código donde está el main)
- modulos.c (Código con una serie de funciones que utiliza el
anterior)
- modulos.h (cabeceras de las funciones y tipos de datos
Para linkarlos incluyo en principal.c la sentencia
#include "modulos.h"
y en modulos.c
#include "modulos.h"
gcc -c principal.c
gcc -o principal principal.o
me da error en la referencia a la funcion "noseque", la cual está en
el .h
También he probado a compilar con
gcc principal.c modulos.c -o principal
En este caso me compila pero, mi duda es, utiliza el .h a la hora de
compilar o coge directamente las funciones de módulos.c.
Gracias y un saludo :)
Loading...