无法使用点布局(将Graphviz作为库)

4

我在一个C++应用程序中使用图形可视化工具graphviz(v2.28.0)作为库,并想要使用dot布局来呈现图形。一切都运行良好,直到我调用gvLayout(_context, _graph, "dot");函数时,输出以下错误:

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

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

-lgvc -lgraph -lpathplan -lcdt -lgvplugin_dot_layout

从Unix命令行调用dot时出现了问题。我做错了什么?
4个回答

5

你可能已经解决了这个问题,或者放弃了,但是我最终还是来到了这里,所以我相信其他人也会...

插件需要显式加载。我不确定这是否与静态链接有关或者每次使用graphviz作为库时都需要执行。

这个方法对我修复了dot:

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

Steffen的解决方案没有起作用,这个可以。谢谢Chris! - Wizard of Kneup

1
当我在macosx上使用gcc编译graphviz时,加入了"-O2"优化标志后出现了这个错误。当我移除该标志时,错误消失了。

0
你是否使用动态库加载的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)似乎起作用了。无论如何,感谢提供答案。 - Wizard of Kneup

0

根据Emden R. Gansner'graphviz-interest'邮件列表上的回复,此错误消息表明软件无法找到graphviz配置文件。

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

Gansner还提到,如果定义了GVBINDIR环境变量,则graphviz将使用它来指定包含graphviz配置文件的目录。这也在如何为Mac App Store配置和打包Graphviz?中讨论过。

在我的情况下(我正在尝试将graphviz库包含在macOS/Objective-C框架中),一个名为“Libraries”的框架子目录包含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插件加载并且上述错误信息(“Error: Layout type: "dot" not recognized. Use one of:”)消失了。然而,任何后续调用gvLayout()都会导致graphviz崩溃(EXC_BAD_ACCESS)。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接