4

再一次,我在这里写 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");

我错过了什么?

编辑

如果有可能与我编译代码的方式有关,这是我正在使用的命令:

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 文件。

4

1 回答 1

3

Graphviz 根据配置文件中的信息动态加载布局和渲染插件,我没有将其复制到我的应用程序目录中。

于 2009-12-24T15:30:40.353 回答