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
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.
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
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.
Si, tambien podes usar #pragma once para eso en VC++.
#ifndef _HeaderName_
#define _HeaderName_
/*Código del header*/
#endif
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.
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++.
Hey gracias ya hice pruebas y parace que si funciona ahora solo me toca adaptarlo al proyecto sera algo lioso :)
RHL: #pragma once al comienzo de la cabecera es bien simple; igual revisa todo y trata de estructurarlo mejor.
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
Y no, no lo es, es para VC++, sino como te mostro Ferno antes.
Hola yo de nuevo :xD
veran e intentado todo lo posible y aun no logro compilar el maldito proyecto, hice una copia en limpio del
proyecto que tengo, asi es la estructura, Lo hice lo mas sencillo posible :P no es del todo, me faltan algunas variables externas y escribir funciones pero el codigo se extendera :P aun así ese codigo no se compila y así es como tengo una parte:
e probado de todo y pues claro los includes los necestio , por favor ayuda ya tengo 3 dias con ese problema :xD
main.cpp
#include <Windows.h>
#include "my1.h"
#include "my2.h"
int WINAPI WinMain(HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nCmdShow)
{
// codigo...
return 0;
}
my1.h
#pragma once
#include <Windows.h>
// declaraciones...
my1.cpp
#include "my1.h"
#include "my2.h"
// codigo...
my2.h
#pragma once
#include <Windows.h>
HANDLE var = NULL;
char mypath[256] = {0};
char* lpbasepath = NULL;
char* lpIndexpath = NULL;
char* lplabel1 = NULL;
char* lplabel2 = NULL;
// demas declaraciones..
my2.cpp
#include "my2.h"
// codigo...
me tira errores:
------ Operación Generar iniciada: proyecto: ERROR 01, configuración: Debug Win32 ------
1> Main.cpp
1> Generando código...
1> Compilando...
1> my2.cpp
1> my1.cpp
1> Generando código...
1>my1.obj : error LNK2005: ya se definió "void * var" (?var@@3PAXA) en Main.obj
1>my1.obj : error LNK2005: ya se definió "char * mypath" (?mypath@@3PADA) en Main.obj
1>my1.obj : error LNK2005: ya se definió "char * lpbasepath" (?lpbasepath@@3PADA) en Main.obj
1>my1.obj : error LNK2005: ya se definió "char * lpIndexpath" (?lpIndexpath@@3PADA) en Main.obj
1>my1.obj : error LNK2005: ya se definió "char * lplabel1" (?lplabel1@@3PADA) en Main.obj
1>my1.obj : error LNK2005: ya se definió "char * lplabel2" (?lplabel2@@3PADA) en Main.obj
1>my2.obj : error LNK2005: ya se definió "void * var" (?var@@3PAXA) en Main.obj
1>my2.obj : error LNK2005: ya se definió "char * mypath" (?mypath@@3PADA) en Main.obj
1>my2.obj : error LNK2005: ya se definió "char * lpbasepath" (?lpbasepath@@3PADA) en Main.obj
1>my2.obj : error LNK2005: ya se definió "char * lpIndexpath" (?lpIndexpath@@3PADA) en Main.obj
1>my2.obj : error LNK2005: ya se definió "char * lplabel1" (?lplabel1@@3PADA) en Main.obj
1>my2.obj : error LNK2005: ya se definió "char * lplabel2" (?lplabel2@@3PADA) en Main.obj
1>C:\Users\Raul\Documents\ERROR 01\Debug\ERROR 01.exe : fatal error LNK1169: se encontraron uno o más símbolos definidos simultáneamente
¿¿Y donde estan los extern?? Lee mi primer respuesta, en my2.h haces lo que te digo que arregles.
PD. Y el extern hace falta si realmente tenes que acceder a esas variables desde otros modulos, sino sacalas directamente de ahi y ponelas en el fuente donde corresponden.
Cita de: Eternal Idol en 15 Marzo 2012, 21:36 PM
¿¿Y donde estan los extern?? Lee mi primer respuesta, en my2.h haces lo que te digo que arregles.
PD. Y el extern hace falta si realmente tenes que acceder a esas variables desde otros modulos, sino sacalas directamente de ahi y ponelas en el fuente donde corresponden.
:xD ;-)
sos un capo Eternal llevo dias y tu en min lo resolviste gracias eso era,
ya pude compilar!
me parece raro quizas esto :S puse las globales en el .cpp correspondiente a cada uno y extern en el que los necesitaba y funciono
crei que las globales externas se escribian en el .h :)
De nadas.