【发布时间】:2009-12-23 22:06:18
【问题描述】:
再一次,我在这里写 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
我一直在关注 this tutorial,它解释了如何将 Graphviz 用作库,因此我链接到它列出的 .lib 文件。
【问题讨论】:
-
嗨,大卫。 I have a question possibly related to this question and related to one of your blog posts。我想提醒您注意它,但我不知道如何与您联系。