Согласно ответ Эмдена Р. Ганснера на ' список рассылки graphviz-interest, это сообщение об ошибке указывает на то, что программе не удалось найти файл конфигурации graphviz.
Файл конфигурации graphviz (config6
) используется библиотекой gvc
для загрузки различных libgvplugin_...
библиотек по запросу.
Ганснер также упоминает, что graphviz поддерживает GVBINDIR
переменную среды, которая, если она определена, используется для указания каталога, содержащего файл конфигурации graphviz. Это также обсуждается в разделе Как настроить и упаковать Graphviz для 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()
вызывал у меня сбой графа (EXC_BAD_ACCESS
).
Итак, пока я использую подход переменных среды.
person
msteffens
schedule
01.06.2019