我使用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按预期工作。我做错了什么?
答案 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}
};