![](/img/trans.png)
[英]How to pass parameters to dot layout engine using c++ graphviz library?
[英]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.