簡體   English   中英

無法使用點布局(graphviz作為庫)

[英]Unable to use dot layout (graphviz as a library)

我將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命令行調用dot可以正常工作。 我究竟做錯了什么 ?

您可能已經解決了這個問題或放棄了,但是我在這里結束了,所以我相信其他人會...

插件需要顯式加載。 我不確定這是否與靜態鏈接有關,還是在將graphviz用作庫時需要完成此操作。

這個固定的點對我來說:

extern gvplugin_library_t gvplugin_dot_layout_LTX_library;
gvAddLibrary(gvc, &gvplugin_dot_layout_LTX_library);

當我在macosx上編譯graphviz時,在gcc中添加了“ -O2”優化標志時,出現了此錯誤。 當我刪除該標志時,錯誤消失了。

根據Emden R. Gansner對“ graphviz-interest”郵件列表答復 ,此錯誤消息表明該軟件無法找到graphviz配置文件。

gvc庫使用graphviz配置文件( config6 )來gvc加載各種libgvplugin_...庫。

Gansner還提到graphviz支持GVBINDIR環境變量 ,如果定義了GVBINDIR變量 ,該變量將用於指定包含graphviz配置文件的目錄。 如何在Mac App Store中配置和打包Graphviz也對此進行了討論

就我而言(在MacOS / Objective-C框架中嘗試包含graphviz庫),一個框架子目錄(稱為“庫”)包含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環境變量是唯一對我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對我造成graphviz崩潰( EXC_BAD_ACCESS )。

所以現在我正在采用環境變量方法。

您是否將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}
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM