Ayuda Erroir error LNK2005 already defined

Iniciado por -MicrO-, 23 Julio 2011, 19:36 PM

0 Miembros y 1 Visitante están viendo este tema.

-MicrO-

Hola a todos yo por aca de nuevo  :xD

Esta vez con un proyecto en "MFC AppWizard (dll)"

el profesor no dios el ejercicio y hay que encontrar errores, luego de resolver el primero me tranque en el segundo error.

quisiera que le hechen un vistaso:


Complejo.cpp

Código (cpp) [Seleccionar]
//fichero main.cpp
#include "stdafx.h"
#include "complejo.h"

void main(void)
{
// declaración de números complejos
complejo c1(1.0, 1.0);
complejo c2(2.0, 2.0);
complejo c3;
c3.SetData(); //pide datos para c3
complejo c4(4.0);
// operadores aritméticos
complejo suma = c1.Suma(c2); //c1+c2
complejo resta = c1.Resta(c3); //c1-c3
complejo producto = c2.Multiplica(c4); //c2*c4
complejo cociente = c1.Cociente(c3); //c1/c3
cout << "Primer complejo: "; c1.Prt();
cout << "Segundo complejo: ";c2.Prt();
cout << "Tercer complejo: "; c3.Prt();
cout << "Suma: " ; suma.Prt();
cout << "Resta: " ; resta.Prt();
cout << "Producto: " ; producto.Prt();
cout << "Cociente: " ; cociente.Prt();
cout << "Ya he terminado." << endl;
}



StdAfx.cpp

Código (cpp) [Seleccionar]
// stdafx.cpp : source file that includes just the standard includes
// complejo.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information

#include "stdafx.h"

#include "complejo.h"




Complejo.h

Código (cpp) [Seleccionar]
// fichero complejo.h
#include <iostream.h>
class complejo
{
private:
double real;
double imag;
public:
// Constructores
complejo(); //defecto
complejo(double, double im=0.0);
// SetThings
void SetData(void);
void SetReal(double);
void SetImag(double);
// GetThings
double GetReal(void){return real;}
double GetImag(void){return imag;}
//Operaciones
complejo Suma(complejo c);
complejo Resta(complejo c);
complejo Multiplica(complejo c);
complejo Cociente(complejo c);
//Salida
void Prt(){ cout << "("<< real <<","<< imag<<"i)"<<endl; }
};


complejo::complejo() // constructor por defecto
{
real = 0.0; imag = 0.0;
}
// constructor general
complejo::complejo(double re,double im)
{
real = re; imag = im;
}
// función miembro SetData()
void complejo::SetData(void)
{
cout << "Parte real: ";
cin >> real;
cout << "Parte imaginaria: ";
cin >> imag;
}
void complejo::SetReal(double re)
{
real = re;
}
void complejo::SetImag(double im)
{
imag = im;
}
complejo complejo::Suma(complejo c)
{
complejo cs;
cs.real = real + c.real;
cs.imag = imag + c.imag;
return cs;
}
complejo complejo::Resta(complejo c)
{
complejo cr;
//escribir el código para restar
cr.real = real - c.real;
cr.imag = imag - c.imag;
return cr;
}
complejo complejo::Multiplica(complejo c)
{
complejo cm;
//escribir el código (a,b) * (c,d) = (ac-bd, ad+bc)
cm.real = real * c.real;
cm.imag = imag * c.imag;
return cm;
}
complejo complejo::Cociente(complejo c)
{
complejo cc;
//escribir (a,b)/(c,d) = ((ac+bd)/(c^2+d^2) , (bc-ad)/(c^2 + d^2 ))
cc.real = real / c.real;
cc.imag = imag / c.imag;
return cc;
}



StdAfx.h

Código (cpp) [Seleccionar]
// stdafx.h : include file for standard system include files,
//  or project specific include files that are used frequently, but
//      are changed infrequently
//

#if !defined(AFX_STDAFX_H__7C1B2F84_8EEA_4865_9808_AB1551CD54C1__INCLUDED_)
#define AFX_STDAFX_H__7C1B2F84_8EEA_4865_9808_AB1551CD54C1__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers

#include <afxwin.h>         // MFC core and standard components
#include <afxext.h>         // MFC extensions

#ifndef _AFX_NO_OLE_SUPPORT
#include <afxole.h>         // MFC OLE classes
#include <afxodlgs.h>       // MFC OLE dialog classes
#include <afxdisp.h>        // MFC Automation classes
#endif // _AFX_NO_OLE_SUPPORT


#ifndef _AFX_NO_DB_SUPPORT
#include <afxdb.h> // MFC ODBC database classes
#endif // _AFX_NO_DB_SUPPORT

#ifndef _AFX_NO_DAO_SUPPORT
#include <afxdao.h> // MFC DAO database classes
#endif // _AFX_NO_DAO_SUPPORT

#include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT



//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_STDAFX_H__7C1B2F84_8EEA_4865_9808_AB1551CD54C1__INCLUDED_)



Al Compilar tengo 0 Errores, pero al Ejecutar me da esto:

StdAfx.obj : error LNK2005: "public: __thiscall complejo::complejo(void)" (??0complejo@@QAE@XZ) already defined in complejo.obj
StdAfx.obj : error LNK2005: "public: __thiscall complejo::complejo(double,double)" (??0complejo@@QAE@NN@Z) already defined in complejo.obj
StdAfx.obj : error LNK2005: "public: void __thiscall complejo::SetData(void)" (?SetData@complejo@@QAEXXZ) already defined in complejo.obj
StdAfx.obj : error LNK2005: "public: void __thiscall complejo::SetReal(double)" (?SetReal@complejo@@QAEXN@Z) already defined in complejo.obj
StdAfx.obj : error LNK2005: "public: void __thiscall complejo::SetImag(double)" (?SetImag@complejo@@QAEXN@Z) already defined in complejo.obj
StdAfx.obj : error LNK2005: "public: class complejo __thiscall complejo::Suma(class complejo)" (?Suma@complejo@@QAE?AV1@V1@@Z) already defined in complejo.obj
StdAfx.obj : error LNK2005: "public: class complejo __thiscall complejo::Resta(class complejo)" (?Resta@complejo@@QAE?AV1@V1@@Z) already defined in complejo.obj
StdAfx.obj : error LNK2005: "public: class complejo __thiscall complejo::Multiplica(class complejo)" (?Multiplica@complejo@@QAE?AV1@V1@@Z) already defined in complejo.obj
StdAfx.obj : error LNK2005: "public: class complejo __thiscall complejo::Cociente(class complejo)" (?Cociente@complejo@@QAE?AV1@V1@@Z) already defined in complejo.obj
StdAfx.obj : warning LNK4006: "public: __thiscall complejo::complejo(void)" (??0complejo@@QAE@XZ) already defined in complejo.obj; second definition ignored
StdAfx.obj : warning LNK4006: "public: __thiscall complejo::complejo(double,double)" (??0complejo@@QAE@NN@Z) already defined in complejo.obj; second definition ignored
StdAfx.obj : warning LNK4006: "public: void __thiscall complejo::SetData(void)" (?SetData@complejo@@QAEXXZ) already defined in complejo.obj; second definition ignored
StdAfx.obj : warning LNK4006: "public: void __thiscall complejo::SetReal(double)" (?SetReal@complejo@@QAEXN@Z) already defined in complejo.obj; second definition ignored
StdAfx.obj : warning LNK4006: "public: void __thiscall complejo::SetImag(double)" (?SetImag@complejo@@QAEXN@Z) already defined in complejo.obj; second definition ignored
StdAfx.obj : warning LNK4006: "public: class complejo __thiscall complejo::Suma(class complejo)" (?Suma@complejo@@QAE?AV1@V1@@Z) already defined in complejo.obj; second definition ignored
StdAfx.obj : warning LNK4006: "public: class complejo __thiscall complejo::Resta(class complejo)" (?Resta@complejo@@QAE?AV1@V1@@Z) already defined in complejo.obj; second definition ignored
StdAfx.obj : warning LNK4006: "public: class complejo __thiscall complejo::Multiplica(class complejo)" (?Multiplica@complejo@@QAE?AV1@V1@@Z) already defined in complejo.obj; second definition ignored
StdAfx.obj : warning LNK4006: "public: class complejo __thiscall complejo::Cociente(class complejo)" (?Cociente@complejo@@QAE?AV1@V1@@Z) already defined in complejo.obj; second definition ignored
   Creating library Debug/complejo.lib and object Debug/complejo.exp
Debug/complejo.dll : fatal error LNK1169: one or more multiply defined symbols found
Error executing link.exe.



Tengo rato buscando el error y no doy, segun veo en foros gringos que leo, que el problema es en las cabezeras pero nada no doy  :-\


Salu2

Arkangel_0x7C5

Funciones duplicadas a causa de que defines la implementacion de los metodos de la clase en un fichero .h que se inclulle varias veces. Tienes que declarar la definicion de la clase en un .h y la implementacion de sus metodos la haces en un fichero .cpp a parte que se compila y linkea con los otros

Saludos

-MicrO-

Cita de: Arcangel_0x7C5 en 23 Julio 2011, 21:43 PM
Funciones duplicadas a causa de que defines la implementacion de los metodos de la clase en un fichero .h que se inclulle varias veces. Tienes que declarar la definicion de la clase en un .h y la implementacion de sus metodos la haces en un fichero .cpp a parte que se compila y linkea con los otros

Saludos

Amigo la verdad no te entendi bien.

Es que en esto somos noob, hasta ahora estamos empezando.

Arkangel_0x7C5

Cita de: -MicrO- en 23 Julio 2011, 22:21 PM
Amigo la verdad no te entendi bien.

Es que en esto somos noob, hasta ahora estamos empezando.
este error:
StdAfx.obj : error LNK2005: "public: __thiscall complejo::complejo(void)" (??0complejo@@QAE@XZ) already defined in complejo.obj
Te esta diciendo que a encontrado 2 veces la implementacion del metodo complejo de la clase complejo
Esto pasa porque:
complejo::complejo(){

}
lo colocaste en un archivo de extension .h que se inclulle en varios archivos. Por lo que se lo encuentra varias veces

-MicrO-

#4
Cita de: Arcangel_0x7C5 en 24 Julio 2011, 00:51 AM
este error:
StdAfx.obj : error LNK2005: "public: __thiscall complejo::complejo(void)" (??0complejo@@QAE@XZ) already defined in complejo.obj
Te esta diciendo que a encontrado 2 veces la implementacion del metodo complejo de la clase complejo
Esto pasa porque:
complejo::complejo(){

}
lo colocaste en un archivo de extension .h que se inclulle en varios archivos. Por lo que se lo encuentra varias veces

ah ya, cierto ya logre solucionar los errores ahora me encuentro con esto:




Estoy buscando a ver que es: segun entiendo que cuando uno trabaja en MFC AppWizard (dll) no ejecuta si no que hay que buscarle algo.

ando viendo a ver.

Arkangel_0x7C5

#5
Citar
Linking....

complejos.dll error(s) 0 warnin(s) 0
Lo que ocurre es que has generado una dll que no es ejecutable directamente. Las dll son cargadas por otros programas para usar sus funciones. Para que se ejecutara tendrías que cargarla con otro programa o cambiar el proyecto para que te genere un exe, una aplicacion win32

Saludos

-MicrO-

Cita de: Arcangel_0x7C5 en 24 Julio 2011, 10:41 AM
Lo que ocurre es que has generado una dll que no es ejecutable directamente. Las dll son cargadas por otros programas para usar sus funciones. Para que se ejecutara tendrías que cargarla con otro programa o cambiar el proyecto para que te genere un exe, una aplicacion win32

Saludos

Si, pero no puedo cambiar el proyecto el ejercio esta en MFC AppWizard (dll) y asi tengo que dejarlo y no se con que otro programa ejecutarlo, hay me pide buscar el ejecutable y al seleccionarlo solo me abre el programa mas no me muestra la ventana con el programa

Arkangel_0x7C5

pues tienes 2 opciones Cambiar el proyecto a Aplicación MFC o crear otro proyecto que use esa dll

no hay mas...

-MicrO-

Cita de: Arcangel_0x7C5 en 24 Julio 2011, 14:42 PM
pues tienes 2 opciones Cambiar el proyecto a Aplicación MFC o crear otro proyecto que use esa dll

no hay mas...


y como cambio el proyecto? Aplicación MFC seria MFC AppWizard(exe)? o tendria que crearlo de nuevo.?