根据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
)。
所以现在我采取环境变量的方法。