我一直试图让cgraph(https://graphviz.gitlab.io/_pages/pdf/cgraph.pdf)工作,所以我读写了一些图形文件我试着写一些非常基本的代码:

#include <assert.h>
#include <ctype.h>
#include <errno.h>
#include <float.h>
#include <limits.h>
#include <math.h>
#include <memory.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <Windows.h>
#include <mysql.h>

#include <graphviz/cgraph.h>

int main() {

    FILE *fp = NULL;
    fp = fopen("test.dot", "w+");

    if (fp == NULL) {
       return -1;
    }

    Agraph_t *g;
    g = agopen("test", Agdirected, NULL);

    Agnode_t *signal1;
    signal1 = agnode(g, "Signal1_ON", TRUE);

    Agnode_t *signal2;
    signal2 = agnode(g, "Signal1_OFF", TRUE);

    Agedge_t *link = agedge(g, signal1, signal2, "link1", TRUE);
    agattr(g, AGEDGE, "label", "transitionlink");

    agwrite(g, fp);

    fclose(fp);

    system("pause");

    return 0;
}

应该发生的是,文件应该写入test.dot此代码在Win64版本上工作得非常好,但在Win64调试、Win32调试和Win32版本上失败我已经仔细检查了visual studio和文件目录中的.lib文件和.dll文件设置,确保正确复制每个平台的发布和调试版本但是,agwrite一直在Win64 debug、Win32 debug和Win32 release上导致“Microsoft Visual Studio C运行库检测到致命错误”崩溃奇怪的是如果我改变
agwrite(g, fp);agwrite(g, stdout);,代码可在所有平台/配置上工作我很困惑为什么会这样这是包含agwrite代码的源文件,如果有帮助的话:https://github.com/ellson/MOTHBALLED-graphviz/blob/master/lib/cgraph/write.c
我无法调试此问题,因为已将每个平台/配置的源代码编译为.dll和.libs。
我很感激你的建议/反馈,
谢谢你
编辑:
对于任何想在自己的系统上运行的人来说,这里是我所有的二进制文件、libs和include文件:https://www.dropbox.com/sh/o9tjz7txu4m0k5q/AAAnp8Wu99q9IsFN7kvqZP7Ta?dl=0
编辑2:
我使用的编译器是Windows10上的MSVC14。

最佳答案

我发现在尝试使用agwrite()时,使用cgraph会直接导致错误解决方案是使用Graphviz C API附带的GVC抽象层来执行文件I/O

#include <assert.h>
#include <ctype.h>
#include <errno.h>
#include <float.h>
#include <limits.h>
#include <math.h>
#include <memory.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <Windows.h>
#include <mysql.h>

#include <graphviz/gvc.h>

int main() {

    GVC_t *gvc;
    gvc = gvContext();

    Agraph_t *g;
    g = agopen("test", Agdirected, NULL);

    Agnode_t *signal1;
    signal1 = agnode(g, "Signal1_ON", TRUE);

    Agnode_t *signal2;
    signal2 = agnode(g, "Signal1_OFF", TRUE);

    Agedge_t *link = agedge(g, signal1, signal2, "link1", TRUE);
    agattr(g, AGEDGE, "label", "transitionlink");

    gvLayout(gvc, g, "dot");
    gvRenderFilename(gvc, g, "dot", "test.dot");
    gvFreeLayout(gvc, g);

    agclose(g);

    gvFreeContext(gvc);

    system("pause");

    return 0;
}

编辑:
以下是全球价值链的文件:https://graphviz.gitlab.io/_pages/pdf/gvc.3.pdf

10-07 23:28