windows 中的 Graphviz 作为库
Graphviz as library in windows
我正在就 Graphviz 库与您联系。我在 windows.
上使用 graphviz 作为 c++ 代码和 qt creator 中的库时观察到一个错误
基于 Documentation 中的示例,我使用以下函数将点文件转换为 png 文件:
bool saveImageGV(){
GVC_t *gvc= gvContext();
gvAddLibrary(gvc, &gvplugin_dot_layout_LTX_library);
gvAddLibrary(gvc, &gvplugin_core_LTX_library);
gvAddLibrary(gvc, &gvplugin_gd_LTX_library);
FILE *fp = fopen((pathTmp + ".dot").c_str(), "r");
Agraph_t *g = agread(fp,0);
gvLayout(gvc, g, "dot");
FILE *fp2 = fopen((pathTmp + ".png").c_str(), "w");
gvRender(gvc, g, "png", fp2);
gvFreeLayout(gvc, g);
agclose(g); fclose(fp); fclose(fp2);
return (gvFreeContext(gvc));
}
似乎在 linux 上,此函数与 graphviz 2.30 配合得很好,我成功地将我的点文件转换为 png 文件。
但是,当我使用 windows 库时,我遇到了具有相同功能的分段错误。
我的调查让我认为问题可能来自 .dll 库,因为在 linux 上,它适用于 2.30 版本但不适用于 2.38 版本的库。 windows, 2.30 和 2.38 导致相同的段错误错误。
这是一个众所周知的错误吗?在 windows 上存在另一种将点文件转换为 png 文件的方法吗?我 link 来自 "Graphviz2.38\lib\release\lib" 文件夹的库,并从 "Graphviz2.38\lib\release\dll" 文件夹中获取 dll。
提前感谢您的回复以及您是否需要更多信息。
可能是stdio版本错误
我在visual studio发生了段错误,这里是解决方案(使用/std:c++latest所以语法不符合标准,代码仅供理解)
Agiodisc_t my_iodisc = {
.afread = [](void* chan, char* buf, int bufsize)->int
{
return fread(buf, 1, bufsize, (FILE*)chan);
},
.putstr = [](void* chan,const char* buf)->int
{
return fwrite(buf, 1, strlen(buf), (FILE*)chan);
},
.flush = [](void* chan)->int
{
return fflush((FILE*)chan);
}
};
Agdisc_t my_disc = {
.mem = NULL, // use system default
.id = NULL, // use system default
.io = &my_iodisc
};
FILE* p_file = fopen("1.gv", "r");
Agraph_t* g = agread(p_file, &my_disc);
fclose(p_file);
我正在就 Graphviz 库与您联系。我在 windows.
上使用 graphviz 作为 c++ 代码和 qt creator 中的库时观察到一个错误基于 Documentation 中的示例,我使用以下函数将点文件转换为 png 文件:
bool saveImageGV(){
GVC_t *gvc= gvContext();
gvAddLibrary(gvc, &gvplugin_dot_layout_LTX_library);
gvAddLibrary(gvc, &gvplugin_core_LTX_library);
gvAddLibrary(gvc, &gvplugin_gd_LTX_library);
FILE *fp = fopen((pathTmp + ".dot").c_str(), "r");
Agraph_t *g = agread(fp,0);
gvLayout(gvc, g, "dot");
FILE *fp2 = fopen((pathTmp + ".png").c_str(), "w");
gvRender(gvc, g, "png", fp2);
gvFreeLayout(gvc, g);
agclose(g); fclose(fp); fclose(fp2);
return (gvFreeContext(gvc));
}
似乎在 linux 上,此函数与 graphviz 2.30 配合得很好,我成功地将我的点文件转换为 png 文件。 但是,当我使用 windows 库时,我遇到了具有相同功能的分段错误。 我的调查让我认为问题可能来自 .dll 库,因为在 linux 上,它适用于 2.30 版本但不适用于 2.38 版本的库。 windows, 2.30 和 2.38 导致相同的段错误错误。
这是一个众所周知的错误吗?在 windows 上存在另一种将点文件转换为 png 文件的方法吗?我 link 来自 "Graphviz2.38\lib\release\lib" 文件夹的库,并从 "Graphviz2.38\lib\release\dll" 文件夹中获取 dll。
提前感谢您的回复以及您是否需要更多信息。
可能是stdio版本错误
我在visual studio发生了段错误,这里是解决方案(使用/std:c++latest所以语法不符合标准,代码仅供理解)
Agiodisc_t my_iodisc = {
.afread = [](void* chan, char* buf, int bufsize)->int
{
return fread(buf, 1, bufsize, (FILE*)chan);
},
.putstr = [](void* chan,const char* buf)->int
{
return fwrite(buf, 1, strlen(buf), (FILE*)chan);
},
.flush = [](void* chan)->int
{
return fflush((FILE*)chan);
}
};
Agdisc_t my_disc = {
.mem = NULL, // use system default
.id = NULL, // use system default
.io = &my_iodisc
};
FILE* p_file = fopen("1.gv", "r");
Agraph_t* g = agread(p_file, &my_disc);
fclose(p_file);