[C con Clase] Compilar aplicación donde int main () llama a una función(), en un archivo separado, y en la función se utiliza una "libreria.h

Joaquin Pérez Valera joaquinperezvalera en gmail.com
Jue Nov 1 15:27:44 CET 2012


Hola

Antes que nada les comento que estoy escribiendo un módulo o función
complementaria, para agregarlo posteriormente a un programa que ya tengo
hecho.

Lo que he hecho es crear tres archivos:
1. Archivo con la aplicación principal, main.cc
2. Archivo de cabecera que contiene la declaración de la función: zeroline.h
3. Archivo donde se encuentran detalladas las funciones: zeroline.cc

Sin embargo, dentro del código del archivo zeroline.cc son llamadas
funciones de otra libreria, shapefil.h (que es una api de shapefiles
<http://shapelib.maptools.org/>
).

Es decir, en mi carpeta tengo más archivos ".c", y obviamente la librería.
La librería incluye su propio método de compilación, así que con make se
crean los archivos ".o", que yo llamo cuando compilo mi aplicación main.cc
#g++ -g *.o *.cc

y bien, así ya tengo funcionando mi aplicación, en fase de desarrollo pero
ya funciona bien.

Se preguntarán entonces qué es lo que este tío quiere o necesita. Bueno, la
verdad es que cuando lo hago en linux no tengo ningún problema. Jeje.

El punto es que la aplicación la hago para que la utilicen otros y ejem,
para eso tengo que compilar también en Windows. De hecho lo que he hecho
antes primero lo hago en linux y después lo paso a Windows, y no he tenido
ningún problema puesto que son muy sencillas, así que descarto problemas
con la no estandarización.

En Windows utilizo la aplicación Dev-c++ para compilar y organizar
proyectos. Sin embargo he tenido problemas al compilar esto, porque me
reconoce las funciones definidas en el archivo zeroline.cpp y declaradas en
zeroline.h, pero las que pertenecen a la librería shapefil.h no, entonces
ese es mi problema, que no me reconoce las funciones de una librería que
utiliza una función que contiene funciones. No sé si me haya dado a
entender, espero que sí.

El resultado que me arroja el dev-c++ es el siguiente:

... undefined reference to SHPCreate

... undefined reference to DBFCreate

... undefined reference to SHPClose

... undefined reference to DBFClose

y otras más, que no pongo pero que son de ese estilo. Y todas ellas son
funciones que llama la función zeroline definida por mí, y que están
definidas en el archivo shapefil.h


Para compilar se necesita la librería shapelib que se descarga de
http://shapelib.maptools.org/

Por si gustan probar, el código de mis archivos es el siguiente.

-------------------------------------------------------------------------------------------
main.cc

#include "zeroline.h"
#include "shapefil.h"
#include <iostream>
#include <string>

using namespace  std;

int main()
{

double X[2], Y[2];
int contador, escala;
string nombreshape="yosoyelshape";

contador = 2;
escala=200;
X[0]=1;
X[1]=2;

Y[0]=3;
Y[1]=4;

zeroline(X, Y, contador, escala, nombreshape);

return 0;

}
------------------------------------------------------------------------------------------------------
zeroline.h

#ifndef ZERO_LINE_H
#define ZERO_LINE_H
#include <string>

using namespace std;

//Prototipo de la función

void zeroline(double Xm[], double Ym[], int k, int scale, std::string
shapenamez);

#endif //ZERO_LINE_H
--------------------------------------------------------------------------
zeroline.cc

#include "zeroline.h"
#include "shapefil.h"
#include <iostream>
#include  <string>

using namespace std;

//void zeroline ()
void zeroline(double Xm[], double Ym[], int k, int scale, std::string
shapenamez)

{

int izeroline=0,jzeroline=0, shapefiletype=3, puntosdelinea=2;;
double Xil[k], Yil[k], Xfl[k], Yfl[k], sc;
double Xz[2], Yz[2];
int field_name;
string  name_id;

shapenamez=shapenamez+"zl";

SHPHandle zerolineshp;
DBFHandle zerolinedbf;
SHPObject *objetops;

sc= scale;
//string zerolinefilename;

cout << "Esta es la función zero line" << endl;
cout << "La escala es: " << scale << endl;
cout << "El nombre del shape es: " << shapenamez << endl;
cout << "El tipo de shape es de arco, su indicador es: " << shapefiletype
<< endl;
cout << "Aquí inicia el cálculo de las coordenadas superior e inferior de
la línea vertical zero para los diagramas" << endl;
for (izeroline=0; izeroline<k; izeroline++)
{
Xil[izeroline]=Xm[izeroline];
Yil[izeroline]=(Ym[izeroline]+(sc*0.55));

Xfl[izeroline]=Xm[izeroline];
Yfl[izeroline]=(Ym[izeroline]-(sc*0.55));
cout << izeroline << endl;
cout << "Punto superior" << endl;
cout << "Xm[" << izeroline << "]=" << Xm[izeroline] << "; Xil[" <<
izeroline << "]=" << Xil[izeroline] << endl;
cout << "Ym[" << izeroline << "]=" << Ym[izeroline] << "; Yil[" <<
izeroline << "]=" << Yil[izeroline] << endl;
cout << "Punto inferior" << endl;
cout << "Xm[" << izeroline << "]=" << Xm[izeroline] << "; Xfl" << izeroline
<< "]=" << Xfl[izeroline] << endl;
cout << "Ym[" << izeroline << "]=" << Ym[izeroline] << "; Yfl" << izeroline
<< "]=" << Yfl[izeroline] << endl;
}
//HERE BEGINS THE BUILDING OF THE SHAPEFILE.
cout << "Construyendo el shapefile" << endl;
zerolineshp = SHPCreate (shapenamez.c_str(), shapefiletype);
zerolinedbf = DBFCreate (shapenamez.c_str());

cout << "Shape y Dbf construidos" << endl;
cout << "agregando información" << endl;
name_id="identificador";

field_name= DBFAddField( zerolinedbf, name_id.c_str(),   FTString, 15, 0);

//
for (izeroline=0; izeroline<k; izeroline++)
{
//Se creará un vector de dos pares de coordenadas para construir la línea
vertical.

for (jzeroline=0; jzeroline<2; jzeroline++)
{
if (jzeroline==0)
{
Xz[jzeroline]=Xil[izeroline];
Yz[jzeroline]=Yil[izeroline];
}
else
{
if (jzeroline==1)
{
Xz[jzeroline]=Xfl[izeroline];
Yz[jzeroline]=Yfl[izeroline];
}
}
}

cout << "Las coordenadas del punto superior son: " << Xz[0] << ", " <<
Yz[0] << endl;

cout << "Las coordenadas del punto central son: " << Xm[izeroline] << ", "
<< Ym[izeroline] << endl;

cout << "Las coordenadas del punto inferior son: " << Xz[1] << ", " <<
Yz[1] << endl;

objetops = SHPCreateSimpleObject(shapefiletype, puntosdelinea, Xz, Yz,NULL);
SHPWriteObject(zerolineshp,-1,objetops);

}

DBFClose(zerolinedbf);
SHPClose(zerolineshp);

cout << "shape y dbf cerrados" << endl;

}

-- 
Saludos

Joaquín Pérez Valera
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20121101/7a7087e3/attachment.html>


Más información sobre la lista de distribución Cconclase