Невозможно использовать точечный макет (graphviz как библиотека)

Я использую 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 работает, как и ожидалось. Что я делаю неправильно ?


person Antoine Gersant    schedule 07.03.2012    source источник


Ответы (4)


Вы, вероятно, либо уже исправили это, либо сдались, но я оказался здесь, так что я уверен, что кто-то еще...

Плагины должны быть загружены явно. Я не уверен, связано ли это со статической компоновкой или это нужно делать всякий раз, когда graphviz используется в качестве библиотеки.

Эта фиксированная точка для меня:

extern gvplugin_library_t gvplugin_dot_layout_LTX_library;
gvAddLibrary(gvc, &gvplugin_dot_layout_LTX_library);
person Chris Devereux    schedule 03.08.2013
comment
Решение Штеффена не сработало. Это сделало. Спасибо Крис! - person Wizard of Kneup; 04.05.2017

Я получил эту ошибку, когда добавил флаг оптимизации «-O2» в gcc при компиляции graphviz на macosx. Когда я удалил этот флаг, ошибка исчезла.

person bu11d0zer    schedule 26.10.2015

Используете ли вы 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}
};
person Steffen    schedule 23.03.2012
comment
Я пробовал этот, но он просто не работал. Я видел это в другом месте (например, Глен Лоу). Я предполагаю, что это могло быть правильным решением. Однако сейчас, в 2017 году, решение Криса Деверо (использующее gvAddLibrary), похоже, работает. В любом случае спасибо за ответ. - person Wizard of Kneup; 04.05.2017

Согласно ответ Эмдена Р. Ганснера на ' список рассылки 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