根据 Emden R. Gansner 在'graphviz-interest' mailing list 上的reply,此错误消息表明该软件无法找到 graphviz 配置文件。
gvc 库使用 graphviz 配置文件 (config6) 按需加载各种 libgvplugin_... 库。
Gansner 还提到,graphviz 支持GVBINDIR environment variable,如果定义,则用于指定包含 graphviz 配置文件的目录。 How to configure & package Graphviz for Mac App Store? 也对此进行了讨论。
就我而言(我试图将 graphviz 库包含在 macOS/Objective-C 框架中),框架子目录(称为“库”)包含 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 插件加载并且上述错误消息('错误:布局类型:“点”无法识别。使用其中之一:')消失了。但是,随后对 gvLayout() 的任何调用都会导致我的 graphviz 崩溃 (EXC_BAD_ACCESS)。
所以现在我采用环境变量方法。