Dividir programa C/C++ en varias partes

hola

despues de un tiempo programando en C/C++ tengo una pequeña (o gran depende de la persona jejje) duda sobre la hora de partir en partes el programa, cada vez se me hacen mas grandes los programas aparte de querer ordenarlos por zonas. Hasta ahora utilizaba un main.c y diversos .h, he visto multitud de veces en proyectos y demas que tienen varios C y varios H que compilan a objetos y luego los linkan en el programa principal.

Yo no se muy bien como hacer un main.c con sus librerias y otro modulo.c con sus otras librerias, se compilen y se integren en un unico ejecutable. ¿Alguna ayudita?. muchas gracias

saludos
es un poco chapucerío, pero simplemente, puedes dividir tu programa en diferentes .c, cada uno con las funciones referentes a un ámbito, y luego hacer includes del .c a pelo en el main.
Tienes varios ficheros .c con su correspondiente .h

Paso 1: Cada fichero .c se compila por separado y te crea un fichero .o que es el código compilado.

Paso 2: El linker luego une esos ficheros .o en un ejecutable o una librería estática (se pueden hacer dinámicas pero eso ya depende del SO que uses, dejémoslo estar así)

Las librarías son agrupaciones de código, o si lo entiendes mejor, agrupaciones de ficheros .o. De hecho si tienes varias librerías estáticas que usas para un proyecto cualquiera, al crear un ejecutable el linker une esas librerías al ejecutable, de manera similar al paso 2 que comento arriba.

El compilador no es inteligente, así que lo que tienes que decirle es que ficheros compilar, y qué ficheros linkar. Eso grosso modo. La cosa se puede complicar más (no mucho más) pero eso más adelante.

¿Cómo hacerlo? Depende. Hay muchas y variadas formas, algunas automatizadas, que son la opción que te recomiendo, pero sin saber qué sistema y compilador usas no se puede concretar más.


Lo de hacer varios includes de los ficheros .c es chapucero, entre otras cosas porque así lo que consigues es que al compilar el ejecutable recompiles siempre el código de esos ficheros.c separados, lo que es una pérdida de tiempo si esos ficheros no han cambiado.
De todas formas lo mejor es pensar un poco la estructura de tu programa desde el principio. Modularizar el código te ayudará ademas a portar tus librerías a futuros programas. [idea]

Quizá ponerte a hacerlo a estas alturas sea peor el remedio que la enfermedad. De todas formas utilizando Make puedes evitar tener que recompilar partes del código previamente compiladas.
SacamantecaS escribió:hola

despues de un tiempo programando en C/C++ tengo una pequeña (o gran depende de la persona jejje) duda sobre la hora de partir en partes el programa, cada vez se me hacen mas grandes los programas aparte de querer ordenarlos por zonas. Hasta ahora utilizaba un main.c y diversos .h, he visto multitud de veces en proyectos y demas que tienen varios C y varios H que compilan a objetos y luego los linkan en el programa principal.

Yo no se muy bien como hacer un main.c con sus librerias y otro modulo.c con sus otras librerias, se compilen y se integren en un unico ejecutable. ¿Alguna ayudita?. muchas gracias

saludos


Ejemplo:

Tenemos los siguientes codigos, pepe1.c pepe2.c pepe3.c main.c

$ gcc -c pepe1.c -o pepe1.o
$ gcc -c pepe2.c -o pepe2.o
$ gcc -c pepe3.c -o pepe3.o
$ gcc -c main.c -o main.o
$ gcc pepe1.o pepe2.o pepe3.o main.o -o nombreprograma

Acuerdate que las cabeceras (.h) de cada codigo esten incluidas donde tienen que estar.

De todos modos esto puedes hacerlo creando un Makefile tal que así:

nombreprograma: pepe1.o pepe2.o pepe3.o main.o
gcc -c pepe1.c -o pepe1.o
gcc -c pepe2.c -o pepe2.o
gcc -c pepe3.c -o pepe3.o
gcc -c main.c -o main.o
gcc pepe1.o pepe2.o pepe3.o main.o -o nombreprograma

Aunque el Makefile tiene muchisimas mas opciones, estas serian las básicas, de esta forma haciendo un simple make te crearia el ejecutable.

Un saludo.
A ese Makefile le sobran la mitad de las reglas. make sabe construir los objetos a partir de las fuentes sin necesidad de decirle como :) (entre otras cosas).

- ferdy
Ferdy escribió:A ese Makefile le sobran la mitad de las reglas. make sabe construir los objetos a partir de las fuentes sin necesidad de decirle como :) (entre otras cosas).

- ferdy


¿Quedaria así entonces?

nombreprograma: pepe1.o pepe2.o pepe3.o main.o
gcc pepe1.o pepe2.o pepe3.o main.o -o nombreprograma

Es como lo he probado de nuevo, y es cierto genera los .o el solo (y yo metiendo lineas como idiota :P )

Un saludo.
nombreprograma: pepe1.o pepe2.o pepe3.o main.o
    $(CC) $^ -o $@


Incluso podrías usar expansiones para generar los .o a partir de todos los .c que existan en el directorio.

- ferdy
Ferdy, tendrías algún tutorial o referencia sobre el tema? Yo estoy muy básico en eso (y soy windowsero así que adios :P)

Yo soy de los que se hace el makefile como DSC, con reglas a piñon y necesitaba algo para empezar que sea un poco asequible :)
La verdad es que no hay nada 'definitivo'... pero bueno:

http://www.gnu.org/software/autoconf/manual/make/
http://sources.redhat.com/autobook/

Es un comienzo.

- ferdy
Ferdy escribió:La verdad es que no hay nada 'definitivo'... pero bueno:

http://www.gnu.org/software/autoconf/manual/make/
http://sources.redhat.com/autobook/

Es un comienzo.

- ferdy


gracias!
gracias a todos

utilizo gcc y habia pensado utilizar make para crear algo asi, pero desconocia que al crear los ficheros objetos y luego linkarlos se podrian utilizas las funciones de uno en otros, como si estuvieran en #include sjjjjj.c o algo asi

saludos
Hombre... hacer #include de un .c en casos puntuales PUEDE ser muy interesante. Pero los casos se cuentan con los dedos de una mano (y te sobra más de la mitad :P).

- ferdy
Ahhh, no sabia ¿Como cuales?

He comprado un par de libros de C/C++, a ver si refresco conocimientos, que entre que no me acuerdo y que siempre he tenido esas dudas... jejeje :p

saludos
13 respuestas