为什么在cgraph库中的agwrite函数在Win64发行版以外的任何配置/平台上意外失败?

时间:2018-07-20 03:51:04

标签: c graph graphviz

我一直在尝试使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调试,Win32调试和Win32版本上导致“ 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。

感谢您的任何建议/反馈, 谢谢

编辑:

对于任何虔诚地尝试在自己的系统上运行它的人,这里是我的所有二进制文件,库和包含文件:https://www.dropbox.com/sh/o9tjz7txu4m0k5q/AAAnp8Wu99q9IsFN7kvqZP7Ta?dl=0

编辑2:

我正在使用的编译器是Windows 10上的MSVC 14。

2 个答案:

答案 0 :(得分:0)

我发现尝试使用agwrite()时直接使用cgraph会导致错误。解决方案是使用Graphviz C API随附的GVC抽象层来执行文件I / O。这是起作用的代码:

 //decalre and initialize Visio objects
        var vApp = new Visio.Application();
        Visio.Document vDoc, vStencil;
        Visio.Page vPage;
        Visio.Shape vToShape, vFromShape, vConnector;
        Visio.Master vConnectorMaster, vFlowChartMaster;
        double dblXLocation;
        double dblYLocation;
        Visio.Cell vBeginCell, vEndCell;
        int iCount;
        string TEMPLATEPATH = @"C:\temp\TestProject\testTemplate.vsdx";

        //Change this constant to match your choice of location and file name.
        string SAVENEWFILE = @"C:\temp\TestProject\testFile.vsdx";
vFlowChartMaster = vStencil.Masters[aryValues[0, 0]];
        dblXLocation = 1;
        dblYLocation = 1;
        vToShape = vPage.Drop(vFlowChartMaster,
           dblXLocation, dblYLocation);
        vToShape.Text = "Test";

 vDoc.Pages[1].Name = "Flowchart Example";
        try
        {
            //Delete the previous version of the file.
            //Kill(SAVENEWFILE);
            File.Delete(SAVENEWFILE);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }


        vDoc.SaveAs(SAVENEWFILE);
        vDoc.Close();
        vApp.Quit();
        vDoc = null;
        vApp = null;
        GC.Collect();

编辑:

以下是GVC的文档:https://graphviz.gitlab.io/_pages/pdf/gvc.3.pdf

答案 1 :(得分:0)

崩溃的原因在Graphviz官方网站上进行了描述:

通常是在使用一个版本的stdio库构建Graphviz库,而使用另一个版本编译用户程序的情况下发生的。如果stdio的FILE结构不同,则对agread()的调用将导致崩溃。这主要是Windows上的一个问题,在Windows上,我们仅提供一个二进制版本,该版本使用一个版本的Visual Studio构建,并根据Visual Studio的版本对stdio进行更改。如果用户尝试使用cygwin或类似的东西(也可能使用不兼容的stdio),也会发生这种情况。

https://graphviz.org/faq/#FaqAgreadCrash