![](/img/trans.png)
[英]How to pass parameters to dot layout engine using c++ graphviz library?
[英]Unable to use dot layout (graphviz as a library)
我将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可以正常工作。 我究竟做错了什么 ?
您可能已经解决了这个问题或放弃了,但是我在这里结束了,所以我相信其他人会...
插件需要显式加载。 我不确定这是否与静态链接有关,还是在将graphviz用作库时需要完成此操作。
这个固定的点对我来说:
extern gvplugin_library_t gvplugin_dot_layout_LTX_library;
gvAddLibrary(gvc, &gvplugin_dot_layout_LTX_library);
当我在macosx上编译graphviz时,在gcc中添加了“ -O2”优化标志时,出现了此错误。 当我删除该标志时,错误消失了。
根据Emden R. Gansner对“ graphviz-interest”邮件列表的答复 ,此错误消息表明该软件无法找到graphviz配置文件。
gvc
库使用graphviz配置文件( config6
)来gvc
加载各种libgvplugin_...
库。
Gansner还提到graphviz支持GVBINDIR
环境变量 ,如果定义了GVBINDIR
变量 ,该变量将用于指定包含graphviz配置文件的目录。 如何在Mac App Store中配置和打包Graphviz也对此进行了讨论。 。
就我而言(在MacOS / Objective-C框架中尝试包含graphviz库),一个框架子目录(称为“库”)包含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
环境变量是唯一对我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()
任何调用EXC_BAD_ACCESS
对我造成graphviz崩溃( EXC_BAD_ACCESS
)。
所以现在我正在采用环境变量方法。
您是否将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}
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.