[GRASS-dev] Problem using C++ libraries with C code

Everardo Gustavo Robredo Esquivelzeta everardo.robredo at gmail.com
Thu May 13 02:58:34 EDT 2010


Hi,

I'm working on a raster module written in C and I want to use C++ libraries
to build a function but I don't know anything about linkers. I tried to use
'extern "C"' to build the function in  C++ code and declare it in a header
file shared by C (the local_proto.h header) but I have no idea if this could
work since I haven't been able to compile. I also tried to modify my
makefile in order to compile the C  and the C++ files together but I have
little experience on building custom makefiles...
I could rewrite the whole code in C++ but that's too much work. Any hint or
example code? By the way, the C++ library that I'm trying to use is GAlib, a
genetic algorithms library.

This is how C++ function looks like:

*extern "C" {
#include <grass/gis.h>
#include <grass/glocale.h>
#include <stdio.h>
#include "fann.h"
#include "local_proto.h"
}

#include <math.h>

#include <ga/GASimpleGA.h>
#include <ga/GABin2DecGenome.h>
#include <ga/std_stream.h>

#define cout STD_COUT


extern "C" void genetic(struct input * init, struct layer * vars, struct
output * out, char * NNconfig, int totalayers, int rows, int cols, int *
fixedcat)
{
/*Nothing yet. I have to learn how to compile this*/
}
*
This is my "local_proto.h" file:

*#include <grass/gis.h>
#include <grass/glocale.h>


struct input
{
    const char *name, *mapset;
    int fd;
    CELL *buf; /**puntero del tipo double CELL**/
};

struct layer
{
    const char *name, *mapset;
    int fd;
    DCELL *buf; /**puntero del tipo double CELL**/
};

struct output
{
    const char *name, *mapset;
    int fd;
    CELL *buf;
};


/* tfile.c */
void Create_training_file(struct input *, struct layer *, int, int, int,
int);

/* simple.c */
void Simple_training(char *, char *, unsigned int, unsigned int, unsigned
int, float, unsigned int *);

/*interpol.c*/
double interpolate(struct layer, int, int, int, int);

/*run.c*/
void run_NN(struct input *, struct layer *, struct output *, char *, int,
int, int, int *);

/*genetic_fann.cc*/

#ifdef __cplusplus
extern "C"
#endif
void genetic(struct input *, struct layer *, struct output *, char *, int,
int, int, int *);
*
And my makefile (pretty much standard):
*
MODULE_TOPDIR = ../..


PGM = r.ailucc


LIBES = $(STATSLIB) $(RASTERLIB) $(GISLIB)
DEPENDENCIES = $(STATSDEP) $(RASTERDEP) $(GISDEP)

include $(MODULE_TOPDIR)/include/Make/Module.make

LDFLAGS+= -lfann


default: cmd
*
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: http://lists.osgeo.org/pipermail/grass-dev/attachments/20100513/d0261354/attachment.html


More information about the grass-dev mailing list