Problema de enlace de codigo fuente.

Moderadores: Kravenbcn, largeroliker, fidelcastro, cerealkiller, pspCaracas, m0skit0, LnD, ka69, zacky06

Responder
JeFNDZ
Habitual
Habitual
Mensajes: 378
Registrado: 11 Sep 2009, 06:44

Problema de enlace de codigo fuente.

Mensaje por JeFNDZ »

Mirando algunos ejemplos de un libro de C++, al tratar de complilar el codigo el "Dev C++" me da errores de enlace:

Código: Seleccionar todo

  [Linker error] undefined reference to `LibroCalificaciones::LibroCalificaciones(std::string)'      [Linker error] undefined reference to `LibroCalificaciones::LibroCalificaciones(std::string)'     [Linker error] undefined reference to `LibroCalificaciones::obtenerNombreCurso()'    [Linker error] undefined reference to `LibroCalificaciones::obtenerNombreCurso()'      [Linker error] undefined reference to `LibroCalificaciones::establecerNombreCurso(std::string)'     [Linker error] undefined reference to `LibroCalificaciones::obtenerNombreCurso()'     [Linker error] undefined reference to `LibroCalificaciones::obtenerNombreCurso()'     ld returned 1 exit status 

Aqui estan los ficheros de codigo fuente:
main.cpp
Spoiler:
#include <iostream>
using namespace std;

#include "LibroCalificaciones.h"

int main()
{
//Crea dos objetos LibroCalificaciones
LibroCalificaciones libroCalificaciones1 ("CS101 Introducción a la programación en C++" );
LibroCalificaciones libroCalificaciones2 ("CS102 C++: Estruc de datos" );

//muestra el nombreCurso de cada LibroCalificaiones
cout << "El nombre inicial del curso de LibroCalificaiones1 es: "
<< libroCalificaciones1.obtenerNombreCurso()
<< "\nEl nombre inicial del curso de libroCalificaionnes2 es: "
<< libroCalificaciones2.obtenerNombreCurso() << endl;

//Modifica el nombreCurso de libroCalificaiones1 (con una cadena con longitud valida)
libroCalificaciones1.establecerNombreCurso ("CS101 Prtrogramación en C++" );

//Muestra el nombreCurso de cada LibroClificaciones
cout << "\nel nombre del curso de libroCalificaciones1 es: "
<< libroCalificaciones1.obtenerNombreCurso()
<< "\nel nombre del curso para libroCalifiaciones2 es: "
<< libroCalificaciones2.obtenerNombreCurso() << endl;

return 0;//Indica que termono correctamente

system("PAUSE");
}//Fin de main()

LibroCalificaciones.cpp
Spoiler:
#include <iostream>

using namespace std;

#include "LibroCalificaciones.h"

//El constructor inicializa a nombreCurso con la cadena que se suministra como argumento
LibroCalificaciones::LibroCalificaciones( string nombre )
{
establecerNombreCurso( nombre );//Valida y almacena a nombreCurso
}//Fin del constructor de LibroCalificaciones

//Funcion que establece el nombre del curso y asegura que el nombre del curso tenga como máximo 25 caracteres
void LibroCalificaciones::establecerNombreCurso( string nombre )
{
if (nombre.length() <= 25 )//Si nombre tiene 25 caracteres o menos
nombreCurso = nombre;//almacena el nombre del curso en el objeto

if (nombre.length() > 25 )//Si nombre tine más de 25 caracteres
{
//EStablece nombreCurso a los primeros 25 caracteres del parametro nombre
nombreCurso = nombre.substr( 0 ,25 );//empieza en 0, longitud de 25

cout << "El nombre \"" << nombre << "\" exede la longitud maxmima (25).\n"
<< "Se limito nombreCurso a los primeros 25 caracteres.\n" << endl;
}//Fin de if
}//Fin de la funcion establecer nombreCurso

//Funcion para obtener el nombre del curso
string LibroCalificaciones::obtenerNombreCurso()
{
return nombreCurso;//Devuelve el nombreCurso del objeto
}//Fin de la funcion obtenerNombreCurso

//Muestra un mensaje de bienvenida al usuario de LibroCalifiaciones
void LibroCalificaciones::mostrarMensaje()
{
//Llama a obtener nombreCurso para obtener el nombreCurso
cout << "Bienvenido al libro de calificaiones para\n" << obtenerNombreCurso() << "!" << endl;
}//Fin de la funcion mostrarMensaje

LibroCalificaciones.h
Spoiler:
#include <string>
using namespace std;


class LibroCalificaciones
{
public:
LibroCalificaciones(string);//Constructor que inicializa un objeto LibroCalificaciones
void establecerNombreCurso(string);//Funcion que establece el nombre del curso
string obtenerNombreCurso();//Funcion que obtiene el nombre del curso
void mostrarMensaje();//Funcion que muestra un mensaje de bienvenida
private:
string nombreCurso;//Nombre del curso para este LibroCalificaiones
};//Fin de la clase LibroCalificaciones

Espero y me puedan ayudar a saber por que no puede enlazar el compilador.

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: Problema de enlace de codigo fuente.

Mensaje por m0skit0 »

El compilador no enlaza (¿para qué usar "link" cuando tienes en castellano una palabra para ello? ;) ), es el enlazador el que lo hace (linker, generalmente ld en Linux).

Si vas a dividir tu proyecto en varios ficheros, necesitarás compilar cada uno por separado y generar los .o correspondientes a cada uno. Luego pasarle estos .o al enlazador. Por ejemplo:

Código: Seleccionar todo

gcc -o a.o a.c
gcc -o b.o b.c
ld b.o c.o resultado

(si no recuerdo mal :lol: )

Te sugiero que uses make para automatizar este proceso.

¡Saludos!
Imagen

JeFNDZ
Habitual
Habitual
Mensajes: 378
Registrado: 11 Sep 2009, 06:44

Re: Problema de enlace de codigo fuente.

Mensaje por JeFNDZ »

o.0 Asi esta mas claro! :oki: .
EDIT:
Pero cuando incluyo con una directiva "#Include"el fichero "LibroCalificaciones.cpp" al codigo cliente(función "main") ahora si compila(omitiendo por completo el fichero .h).

Avatar de Usuario
m0skit0
Administrador
Administrador
Mensajes: 5585
Registrado: 03 Sep 2009, 09:35
Ubicación: 0xdeadbeef

Re: Problema de enlace de codigo fuente.

Mensaje por m0skit0 »

Primero, los fichero .cpp no se incluyen por convenio. Eso se hace como te he comentado antes.
Segundo, obvio que no necesitas el .h porque seguramente ya esta incluído en el .cpp.
Imagen

JeFNDZ
Habitual
Habitual
Mensajes: 378
Registrado: 11 Sep 2009, 06:44

Re: Problema de enlace de codigo fuente.

Mensaje por JeFNDZ »

Según el autor debería de compilarse tal cual (el se basa en Visual C++) así que voy a probar instalando Visual y compilarlo(si aún así no se compila entonces el autor esta safado :lol: ).
Aunque ya lo compile en g++.

Responder