Warum schlägt Graphviz in gvLayout fehl?
Hier schreibe ich wieder C, ohne wirklich zu wissen, was ich tue ...
Ich habe eine einfache Funktion zusammengefügt, die ich aus einem C # -Programm aufrufen kann, das eine DOT-Zeichenfolge, ein Ausgabeformat und einen Dateinamen verwendet und ein Diagramm mit Graphviz rendert.
#include "types.h"
#include "graph.h"
#include "gvc.h"
#define FUNC_EXPORT __declspec(dllexport)
// Return codes
#define GVUTIL_SUCCESS 0
#define GVUTIL_ERROR_GVC 1
#define GVUTIL_ERROR_DOT 2
#define GVUTIL_ERROR_LAYOUT 3
#define GVUTIL_ERROR_RENDER 4
FUNC_EXPORT int RenderDot(char * dotData, const char * format,
const char * fileName) {
Agraph_t * g; // The graph
GVC_t * gvc; // The Graphviz context
int result; // Result of layout and render operations
// Create a new graphviz context
gvc = gvContext();
if (!gvc) return GVUTIL_ERROR_GVC;
// Read the DOT data into the graph
g = agmemread(dotData);
if (!g) return GVUTIL_ERROR_DOT;
// Layout the graph
result = gvLayout(gvc, g, "dot");
if (result) return GVUTIL_ERROR_LAYOUT;
// Render the graph
result = gvRenderFilename(gvc, g, format, fileName);
if (result) return GVUTIL_ERROR_RENDER;
// Free the layout
gvFreeLayout(gvc, g);
// Close the graph
agclose(g);
// Free the graphviz context
gvFreeContext(gvc);
return GVUTIL_SUCCESS;
}
Es kompiliert gut, aber wenn ich es nenne, bekomme ichGVUTIL_ERROR_LAYOUT
. Zuerst dachte ich, es könnte sein, dass ich meine P / Invoke-Signatur deklariert habe, also habe ich sie stattdessen in einem C-Programm getestet, aber es ist immer noch auf die gleiche Weise fehlgeschlagen.
RenderDot("digraph graphname { a -> b -> c; }", "png", "C:\testgraph.png");
Habe ich etwas verpasst?
BEARBEITEN
Wenn es eine Chance gibt, die damit zu tun hat, wie ich den Code kompiliere, ist hier der Befehl, den ich verwende:
cl gvutil.c /I "C:\Program Files (x86)\Graphviz2.26\include\graphviz"
/LD /link /LIBPATH:"C:\Program Files (x86)\Graphviz2.26\lib\release"
gvc.lib graph.lib cdt.lib pathplan.lib
Ich habe verfolgtdieses Tutorial Das erklärt, wie Graphviz als Bibliothek verwendet wird. Deshalb habe ich eine Verknüpfung zu den darin aufgelisteten .lib-Dateien hergestellt.