Невозможно использовать точечный макет (графвиз в качестве библиотеки) - PullRequest
3 голосов
/ 07 марта 2012

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

Ответы [ 4 ]

4 голосов
/ 04 августа 2013

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

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

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

extern gvplugin_library_t gvplugin_dot_layout_LTX_library;
gvAddLibrary(gvc, &gvplugin_dot_layout_LTX_library);
0 голосов
/ 01 июня 2019

Согласно ответу Эмдена Р. Ганснера в списке рассылки 'graphviz-интереса' , это сообщение об ошибке указывает на то, что программе не удалось найти файл конфигурации graphviz.

Файл конфигурации graphviz (config6) используется библиотекой gvc для загрузки различных библиотек libgvplugin_... по требованию.

Ганснер также упоминает, что graphviz поддерживает переменную окружения GVBINDIR , которая, если она определена, используется для указания каталога, содержащего файл конфигурации graphviz. Это также обсуждается на Как настроить и упаковать Graphviz для Mac App Store? .

В моем случае (где я пытаюсь включить библиотеки graphviz в каркас macOS / Objective-C) подкаталог каркаса (называемый «Библиотеки») содержит файл config6 плюс эти библиотеки libgvplugin_... (далее в обычные библиотеки графвизов):

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).

Итак, сейчас я использую подход к переменной среды.

0 голосов
/ 27 октября 2015

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

0 голосов
/ 23 марта 2012

Вы используете 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}
};
...