#1 Le 05/01/2007, à 11:52
- momofiant
utiliser une bibliotheque c dans un programme cpp
Slt, je dois utiliser graphviz (bibliotheque c) dans un programme cpp comme une bibliotheque. Je sais que je dois utiliser extern "C" mais je ne sais pas pourquoi ça ne focntionne pas, je dois mal faire quelque chose car il ne retrouve meme plus la bibliotheque gvc.h !!! voici mes fichiers
/********demo.cpp********/
#include <gvc.h>
#ifdef __cplusplus
extern "C" {
#endif
int main(int argc, char **argv)
{
Agraph_t *g;
Agnode_t *n, *m;
Agedge_t *e;
Agsym_t *a;
GVC_t *gvc;
/* set up a graphviz context */
gvc = gvContext();
/* parse command line args - minimally argv[0] sets layout engine */
gvParseArgs(gvc, argc, argv);
/* Create a simple digraph */
g = agopen("g", AGDIGRAPH);
n = agnode(g, "n");
m = agnode(g, "m");
e = agedge(g, n, m);
/* Set an attribute - in this case one that affects the visible rendering */
agsafeset(n, "color", "red", "");
/* Compute a layout using layout engine from command line args */
gvLayoutJobs(gvc, g);
/* Write the graph according to -T and -o options */
gvRenderJobs(gvc, g);
/* Free layout data */
gvFreeLayout(gvc, g);
/* Free graph structures */
agclose(g);
/* close output file, free context, and return number of errors */
return (gvFreeContext(gvc));
}
#ifdef __cplusplus
}
#endif
/***********gvc.h**************/
#ifndef GVC_H
#define GVC_H
#include "types.h"
#include "graph.h"
#ifdef __cplusplus
extern "C" {
#endif
#define dotneato_initialize dotneato_initialize_DEPRECATED_BY_gvParseArgs
#define parse_args parse_args_DEPRECATED_BY_gvParseArgs
[...]
#ifdef __cplusplus
}
#endif
#endif /* GVC_H */
/*************Makefile******************/
CC=g++
CFLAGS=-Wall -o2 -g `pkg-config libgvc --cflags`
LDFLAGS=`pkg-config libgvc --libs`
OBJECTS=demo.o
TARGET=demo
all: $(TARGET)
$(TARGET): $(OBJECTS)
$(CC) $(LDFLAGS) -o $(TARGET) $(OBJECTS)
clean:
rm -rf *.o *.*~
/*********Erreurs de compilation****************/
@debian:~/Desktop/Projet/graphviz/graph_cpp$ make
g++ -c -o demo.o demo.cpp
demo.cpp:1:17: error: gvc.h: Aucun fichier ou répertoire de ce type
demo.cpp: In function 'int main(int, char**)':
demo.cpp:11: error: 'Agraph_t' was not declared in this scope
demo.cpp:11: error: 'g' was not declared in this scope
demo.cpp:12: error: 'Agnode_t' was not declared in this scope
demo.cpp:12: error: 'n' was not declared in this scope
demo.cpp:12: error: 'm' was not declared in this scope
Hors ligne
#2 Le 05/01/2007, à 12:25
- any
Re : utiliser une bibliotheque c dans un programme cpp
peut etre essayer de remplacer
#include <gvc.h> par
#include <graphviz/gvc.h>
#3 Le 05/01/2007, à 12:58
- any
Re : utiliser une bibliotheque c dans un programme cpp
ou peut etre plutot modifier le makefile aulieu du demo.c !
CC=g++
CFLAGS=-Wall -O2 -g `pkg-config libgvc --cflags`
LDFLAGS=`pkg-config libgvc --libs`
OBJECTS=demo.o
TARGET=demo
all: $(TARGET)
$(TARGET): $(OBJECTS)
$(CC) -o $@ $^ $(LDFLAGS)
%.o: %.cpp
$(CC) -o $@ -c $< $(CFLAGS)
clean:
rm -rf *.o *.*~
la ca devrait bien compiler .
#4 Le 05/01/2007, à 14:55
- any
Re : utiliser une bibliotheque c dans un programme cpp
je viens de tester et ca compile mais erreur a l'execution
d'apres ce que j'ai pu lire il faut modifie le makefile et ajouter :
-Wl,--rpath -W1, `pkg-config libgvc --variable=libdir`
a LDFLAGS
et la ca compile et execute sans probleme.
CC=g++
CFLAGS=-Wall -O2 -g `pkg-config libgvc --cflags`
LDFLAGS=-Wl,--rpath -W1, `pkg-config libgvc --variable=libdir` `pkg-config libgvc --libs`
OBJECTS=demo.o
TARGET=demo
all: $(TARGET)
$(TARGET): $(OBJECTS)
$(CC) -o $@ $^ $(LDFLAGS)
%.o: %.cpp
$(CC) -o $@ -c $< $(CFLAGS)
clean:
rm -rf *.o *.*~
#5 Le 05/01/2007, à 23:14
- salut
Re : utiliser une bibliotheque c dans un programme cpp
Salut!
S'il s'agit d'un problème à l'édition des liens pendant la phase de compilation:
Pour inclure une bibliothèque C dans un programme C++, il faut aussi inclure les fichiers d'include correspondant à ta bibliothèque C dans un extern "C":
extern "C" {
#include <fichier_include.h>
}
Mes deux cents...