Graphviz作为Windows中的库

问题描述 投票:1回答:1

我正在就Graphviz库与您联系。我在使用graphviz作为Windows上的c ++代码和qt创建器中的库时观察到一个错误。

基于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上,.dll库适用于2.30版本,但不适用于2.38版本的库。对于Windows,2.30和2.38会导致相同的分段错误错误。

这是一个众所周知的错误,它是在Windows上将点文件转换为png文件的另一种方法吗?我从“ Graphviz2.38 \ lib \ release \ lib”文件夹中链接库,并从“ Graphviz2.38 \ lib \ release \ dll”文件夹中获取dll。

在此先感谢您的答复,如果您需要更多信息,请联系我们。

c++ c++11 qt-creator graphviz dynamic-library
1个回答
0
投票

graphviz FAQ

也许是由于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);
© www.soinside.com 2019 - 2024. All rights reserved.