【问题标题】:Unable to use dot layout (graphviz as a library)无法使用点布局(graphviz 作为库)
【发布时间】:2019-06-01 22:01:36
【问题描述】:

我在 C++ 应用程序中使用 graphviz (v2.28.0) 作为库,我想使用点布局呈现图形。一切正常,直到我调用输出以下错误的 gvLayout(_context, _graph, "dot"); 函数:

 Error: Layout type: "dot" not recognized. Use one of:

链接时我使用以下库标志:

-lgvc -lgraph -lpathplan -lcdt -lgvplugin_dot_layout

从 Unix 命令行调用 dot 可以正常工作。我做错了什么?

【问题讨论】:

    标签: c++ graphviz dot


    【解决方案1】:

    您可能已经修复或放弃了,但我最终来到这里,所以我相信其他人会...

    插件需要显式加载。我不确定这是否与静态链接有关,或者在将 graphviz 用作库时需要这样做。

    这个固定点对我来说:

    extern gvplugin_library_t gvplugin_dot_layout_LTX_library;
    gvAddLibrary(gvc, &gvplugin_dot_layout_LTX_library);
    

    【讨论】:

    • Steffen 的解决方案没有成功。这做到了。谢谢克里斯!
    【解决方案2】:

    当我在 macosx 上编译 graphviz 时,将“-O2”优化标志添加到 gcc 时出现此错误。当我删除该标志时,错误就消失了。

    【讨论】:

      【解决方案3】:

      您是否使用带有动态库加载的graphviz?在静态环境中,以下几行可能会有所帮助:

      #include "gvplugin.h"
      
      extern gvplugin_library_t gvplugin_dot_layout_LTX_library;
      extern gvplugin_library_t gvplugin_neato_layout_LTX_library;
      extern gvplugin_library_t gvplugin_core_LTX_library;
      extern gvplugin_library_t gvplugin_quartz_LTX_library;
      extern gvplugin_library_t gvplugin_visio_LTX_library;
      
      lt_symlist_t lt_preloaded_symbols[] =
      {
          { "gvplugin_dot_layout_LTX_library", &gvplugin_dot_layout_LTX_library},
          { "gvplugin_neato_layout_LTX_library", &gvplugin_neato_layout_LTX_library},
          { "gvplugin_core_LTX_library", &gvplugin_core_LTX_library},
          { "gvplugin_quartz_LTX_library", &gvplugin_quartz_LTX_library},
          { "gvplugin_visio_LTX_library", &gvplugin_visio_LTX_library},
          { 0, 0}
      };
      

      【讨论】:

      • 我试过这个,但它根本不起作用。我在其他地方看到过(以 Glen Low 为例)。我认为它可能是正确的解决方案,但是,现在在 2017 年,Chris Devereux 的解决方案(使用 gvAddLibrary)似乎有效。无论如何感谢您提供答案。
      【解决方案4】:

      根据 Emden R. Gansner 在'graphviz-interest' mailing list 上的reply,此错误消息表明该软件无法找到 graphviz 配置文件。

      gvc 库使用 graphviz 配置文件 (config6) 按需加载各种 libgvplugin_... 库。

      Gansner 还提到,graphviz 支持GVBINDIR environment variable,如果定义,则用于指定包含 graphviz 配置文件的目录。 How to configure & package Graphviz for Mac App Store? 也对此进行了讨论。

      就我而言(我试图将 graphviz 库包含在 macOS/Objective-C 框架中),框架子目录(称为“库”)包含 config6 文件以及这些 libgvplugin_... 库(下一个到常规的graphviz库):

      Libraries:
          config6
          libgvplugin_core.6.dylib
          libgvplugin_dot_layout.6.dylib
          libgvplugin_gd.6.dylib
          libgvplugin_neato_layout.6.dylib
          libgvplugin_quartz.6.dylib
      

      在框架的一个类中,可以像这样设置GVBINDIR 环境变量:

      NSBundle *containingBundle = [NSBundle bundleForClass:[self class]];
      NSURL *librariesDirURL = [[containingBundle bundleURL] URLByAppendingPathComponent:@"Versions/A/Libraries" isDirectory:YES];
      if (librariesDirURL) {
          setenv("GVBINDIR", (char*)[[librariesDirURL path] UTF8String], 1);
      }
      

      设置GVBINDIR 环境变量是唯一对我有用的解决方案。

      我也尝试过上面其他人提到的解决方案,包括显式加载默认的 graphviz 插件。例如,_graphContext 被定义为 static GVC_t *_graphContext,这段代码:

      extern gvplugin_library_t gvplugin_dot_layout_LTX_library;
      extern gvplugin_library_t gvplugin_neato_layout_LTX_library;
      extern gvplugin_library_t gvplugin_core_LTX_library;
      extern gvplugin_library_t gvplugin_quartz_LTX_library;
      
      lt_symlist_t lt_preloaded_symbols[] =
      {
          { "gvplugin_dot_layout_LTX_library", &gvplugin_dot_layout_LTX_library},
          { "gvplugin_neato_layout_LTX_library", &gvplugin_neato_layout_LTX_library},
          { "gvplugin_core_LTX_library", &gvplugin_core_LTX_library},
          { "gvplugin_quartz_LTX_library", &gvplugin_quartz_LTX_library},
          { 0, 0}
      };
      
      _graphContext = gvContextPlugins(lt_preloaded_symbols, 1);
      

      实际上对我有用。即,这导致 graphviz 插件加载并且上述错误消息('错误:布局类型:“点”无法识别。使用其中之一:')消失了。但是,随后对 gvLayout() 的任何调用都会导致我的 graphviz 崩溃 (EXC_BAD_ACCESS)。

      所以现在我采用环境变量方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-09-11
        • 1970-01-01
        • 2011-12-16
        • 1970-01-01
        • 2020-09-06
        • 1970-01-01
        • 2011-01-17
        相关资源
        最近更新 更多