Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: x64core en 13 Marzo 2012, 21:55 pm



Título: Ayuda: Problema enlazando varios archivos Fuentes y cabeceras
Publicado por: x64core en 13 Marzo 2012, 21:55 pm
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:

Código:
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


Título: Re: Ayuda: Problema enlazando varios archivos Fuentes y cabeceras
Publicado por: 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.


Título: Re: Ayuda: Problema enlazando varios archivos Fuentes y cabeceras
Publicado por: x64core en 14 Marzo 2012, 00:38 am
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




Título: Re: Ayuda: Problema enlazando varios archivos Fuentes y cabeceras
Publicado por: Ferno en 14 Marzo 2012, 05:43 am
En cada header que vos programes es conveniente utilizar la compilación condicional.

Código
  1. #ifndef _HeaderName_
  2. #define _HeaderName_
  3. /*Código del header*/
  4. #endif
  5.  

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.


Título: Re: Ayuda: Problema enlazando varios archivos Fuentes y cabeceras
Publicado por: Eternal Idol en 14 Marzo 2012, 10:09 am
Si, tambien podes usar #pragma once para eso en VC++.

Código
  1. #ifndef _HeaderName_
  2. #define _HeaderName_
  3. /*Código del header*/
  4. #endif


Título: Re: Ayuda: Problema enlazando varios archivos Fuentes y cabeceras
Publicado por: 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.


Título: Re: Ayuda: Problema enlazando varios archivos Fuentes y cabeceras
Publicado por: Eternal Idol en 14 Marzo 2012, 16:49 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++.


Título: Re: Ayuda: Problema enlazando varios archivos Fuentes y cabeceras
Publicado por: x64core en 14 Marzo 2012, 18:05 pm
Hey gracias ya hice pruebas y parace que si funciona ahora solo me toca adaptarlo al proyecto sera algo lioso :)


Título: Re: Ayuda: Problema enlazando varios archivos Fuentes y cabeceras
Publicado por: 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.


Título: Re: Ayuda: Problema enlazando varios archivos Fuentes y cabeceras
Publicado por: x64core en 15 Marzo 2012, 03:32 am
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


Título: Re: Ayuda: Problema enlazando varios archivos Fuentes y cabeceras
Publicado por: Eternal Idol en 15 Marzo 2012, 09:09 am
Y no, no lo es, es para VC++, sino como te mostro Ferno antes.


Título: Re: Ayuda: Problema enlazando varios archivos Fuentes y cabeceras
Publicado por: x64core en 15 Marzo 2012, 20:46 pm
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
Código:
#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
Código:
#pragma once
#include <Windows.h>
// declaraciones...

my1.cpp
Código:
#include "my1.h"
#include "my2.h"
// codigo...

my2.h
Código:
#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
Código:
#include "my2.h"
// codigo...


me tira errores:


Código:
------ 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


Título: Re: Ayuda: Problema enlazando varios archivos Fuentes y cabeceras
Publicado por: 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.


Título: Re: Ayuda: Problema enlazando varios archivos Fuentes y cabeceras
Publicado por: x64core en 15 Marzo 2012, 21:52 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  :)


Título: Re: Ayuda: Problema enlazando varios archivos Fuentes y cabeceras
Publicado por: Eternal Idol en 15 Marzo 2012, 21:59 pm
De nadas.