[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