Ayuda: Problema enlazando varios archivos Fuentes y cabeceras

Iniciado por x64core, 13 Marzo 2012, 21:55 PM

0 Miembros y 7 Visitantes están viendo este tema.

x64core

Hola a todos bueno os cuento que tengo un problemon veran tengo varios archivos fuentes (.cpp) cada uno con un
header (.h) por ejemplo:

main1.cpp + main1.h
main2.cpp + main2.h

e leido un poco sobre programacion modular por eso mismo y porque es mas ordenado y limpio verdad, entonces
en los header de algunos fuentes necesito declarar la windows.h porque necesito declarar variables como HANDLE o constantes
como NULL... y asi...

entonces a la hora de compilar me muestra errores de enlazado como:

1>  other.cpp
1>Main.obj : error LNK2005: ya se definió "void * HL" (?HL@@3PAXA) en k.obj
1>Main.obj : error LNK2005: ya se definió "char * PL" (?PL@@3PADA) en k.obj
1>Main.obj : error LNK2005: ya se definió "long totBytes" (?totBytes@@3JA) en k.obj
1>Main.obj : error LNK2005: ya se definió "char * lpB" (?lpB@@3PADA) en k.obj
1>Main.obj : error LNK2005: ya se definió "char * lpInd" (?lpInd@@3PADA) en k.obj
1>Main.obj : error LNK2005: ya se definió "char * lplblNd" (?lplblNd@@3PADA) en k.obj
1>Main.obj : error LNK2005: ya se definió "char * lplblCb" (?lplblCb@@3PADA) en k.obj
1>MagL.obj : error LNK2005: ya se definió "void * HL" (?HL@@3PAXA) en k.obj
1>MagL.obj : error LNK2005: ya se definió "char * PL" (?PL@@3PADA) en k.obj
1>MagL.obj : error LNK2005: ya se definió "long totBytes" (?totBytes@@3JA) en k.obj
1>MagL.obj : error LNK2005: ya se definió "char * lpB" (?lpB@@3PADA) en k.obj
...


recuerdo haber encontrado un tutorial que mostraba eso de incluir archivos de cabecera aninados y multpliques pero
que exactamente creo que es lo me pasa pero no lo logro encontrarlo de nuevo! :@

Alguien Sabe como puedo solucionar esto? osea alguna pagina donde lo muestre tambien encontre una forma
usando una condiciones de precompilacion (#if,#else) pero la verdad no me gusto mucho :P
nose si solo existe esa forma :P gracias gente

Eternal Idol

En la cabecera declaras como extern y despues lo definis en el fuente una vez.

PD. Mejor usa nombres de variables mas largos, asi tienen sentido al leerlos y solo declara en las cabeceras lo que realmente sea para exponer a otros modulos.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

x64core

Cita de: Eternal Idol en 13 Marzo 2012, 22:37 PM
En la cabecera declaras como extern y despues lo definis en el fuente una vez.

PD. Mejor usa nombres de variables mas largos, asi tienen sentido al leerlos y solo declara en las cabeceras lo que realmente sea para exponer a otros modulos.

Si, declaro las variables que necesito en otros modulos como extern hasta ese punto creo que todo bien :P
el problema es que por ejemplo tengo

main.cpp
main1.cpp + main1.h
main2.cpp + main2.h

el main.cpp es el principal incluyo a Windows.h ( porque necesito APIs,constantes,etc) e incluyo tambien a main1.h y main2.h
( porque necesito las funciones variables, etc) luego en main1.h y main2.h tambien incluyo a windows.h por la misma razon.
y tambien en main1.h incluyo a main2.h porque necesito usar las funciones de main2.h :P
creo que ese es el problema x3



Ferno

#3
En cada header que vos programes es conveniente utilizar la compilación condicional.


#ifndef _HeaderName_
#define _HeaderName_
/*Código del header*/
#endif


Es probable que el compilador esté pasando varias veces por el mismo lado.

EDIT: Me faltó el _HeaderName_ en la primer línea del code. Perdón y gracias Eternal Idol.

Eternal Idol

Si, tambien podes usar #pragma once para eso en VC++.

#ifndef _HeaderName_
#define _HeaderName_
/*Código del header*/
#endif

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

armizh

Si aun asi no resulta, puedes probar a pasar el argumento zmuldefs al linker (en estos momentos no recuerdo con cual argumento de g++ se hacia, pero en la ayuda dice) el cual permite alojar multiples definiciones.

Saludos.
Visita mi blog:
http://armizh.10h.us/
Fnx, fork de FreeNOS:
Código (sh) [Seleccionar]
git clone https://github.com/armizh/Fnx
Hamster, Entorno Integrado de Desarrollo C/C++:
Código (sh) [Seleccionar]
git clone https://github.com/armizh/Hamster

Eternal Idol

Cita de: armizh en 14 Marzo 2012, 16:35 PM
Si aun asi no resulta, puedes probar a pasar el argumento zmuldefs al linker (en estos momentos no recuerdo con cual argumento de g++ se hacia, pero en la ayuda dice) el cual permite alojar multiples definiciones.

Saludos.

La proxima vez lee el hilo completo y con atencion, es obvio que no usa g++.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

x64core

Hey gracias ya hice pruebas y parace que si funciona ahora solo me toca adaptarlo al proyecto sera algo lioso :)

Eternal Idol

RHL: #pragma once al comienzo de la cabecera es bien simple; igual revisa todo y trata de estructurarlo mejor.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

x64core

Cita de: Eternal Idol en 14 Marzo 2012, 18:52 PM
RHL: #pragma once al comienzo de la cabecera es bien simple; igual revisa todo y trata de estructurarlo mejor.
;-) exacto lo que necesitaba :3
sin tanto lio gracias Eternal, ahorita voy a averiguar mas porque lei que no era portable :P