[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


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 *
/*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,

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

double interpolate(struct layer, int, int, int, int);

void run_NN(struct input *, struct layer *, struct output *, char *, int,
int, int, int *);


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

PGM = r.ailucc


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