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

时间:2012-03-07 13:10:07

标签: c++ graphviz dot

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

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

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

-lgvc -lgraph -lpathplan -lcdt -lgvplugin_dot_layout

从Unix命令行调用dot按预期工作。我做错了什么?

4 个答案:

答案 0 :(得分:4)

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

需要明确加载插件。我不确定这是否与静态链接有关,或者只要graphviz用作库就需要完成。

这个固定点对我来说:

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

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

在我的情况下(我试图将graphviz库包含在macOS / Objective-C框架中),框架子目录(称为“库”)包含config6文件以及这些{{1} }库(常规graphviz库的旁边):

libgvplugin_...

然后,可以从框架的某个类中设置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); } 环境变量是唯一对我有用的解决方案。

我还尝试了上面其他人提到的解决方案,包括显式加载默认的graphviz插件。例如,将GVBINDIR定义为_graphContext,此代码:

static GVC_t *_graphContext

实际上为我工作。即,这导致graphviz插件加载,并且上述错误消息(“错误:布局类型:“点”无法识别。请使用以下其中之一:“)消失。但是,随后对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())。

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

答案 3 :(得分:-1)

您是否将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}
};