Почему Graphviz не работает на gvLayout? - PullRequest
3 голосов
/ 24 декабря 2009

Еще раз, здесь я пишу C, не зная, что я делаю ...

Я собрал простую функцию, которую я могу вызвать из программы на C #, которая принимает строку DOT, формат вывода и имя файла и отображает график с помощью Graphviz.

#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;
}

Он прекрасно компилируется, но когда я его вызываю, я получаю GVUTIL_ERROR_LAYOUT. Сначала я подумал, что, возможно, именно так я и объявил свою подпись P / Invoke, поэтому я протестировал ее вместо программы на C, но она все равно не удалась.

RenderDot("digraph graphname { a -> b -> c; }", "png", "C:\testgraph.png");

Я что-то пропустил?

EDIT

Если есть вероятность, что это связано с тем, как я компилирую код, вот команда, которую я использую:

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

Я следовал этому учебному пособию , в котором объясняется, как использовать Graphviz в качестве библиотеки, поэтому я связался с перечисленными в нем .lib-файлами.

1 Ответ

3 голосов
/ 24 декабря 2009

Graphviz загружает плагины макета и рендеринга динамически на основе информации в файле конфигурации, которую я не скопировал в каталог моего приложения.

...