在使用CMake构建一个开源项目时(在我的例子中,它是柠檬图库),当我尝试通过-DBUILD_SHARED_LIBS=1
以下方式构建共享库时出现此错误:
TARGETS given no LIBRARY DESTINATION for shared library target
Run Code Online (Sandbox Code Playgroud)
这个错误来自哪里,我该如何解决?
有向图和无向图的数据结构具有根本重要性.公知和广泛使用的实现方式中,如Boost图库和柠檬被设计为使得节点和边的连续整数索引不暴露于经由接口用户.
相反,用户通过(小)代表对象识别节点和边缘.一个优点是当节点和边缘的索引由于从图形中移除边缘或节点而改变时,这些对象被自动更新.
在我看来(!),这个优势被高估了.用户通常将节点和/或边缘的代表性对象存储在容器中,例如,std::vector
.现在,如果从图形中移除节点或边缘并且它们的代表对象变得无效,则用户需要忽略该向量或重新排列向量以便保持有效的整数索引连续,即,完全执行设计所应的簿记.做不必要的.
因此,我的问题是:设计选择(隐藏用户的节点和边缘的连续整数索引)是否还有其他优点?
在Lemon教程中,所有示例都在绘制图形时指定coords:
graphToEps(g,"graph_to_eps_demo_out_1_pure.eps").
coords(coords).
title("Sample .eps figure").
copyright("(C) 2003-2009 LEMON Project").
run();
Run Code Online (Sandbox Code Playgroud)
是否有可能在不指定coords的情况下将图形图像导出到.eps文件(或任何其他文件)?(我的意思是自动安排)
我正在尝试从专有图库迁移到开源图库.
编辑:因为很少有人知道Boost Graph是如何工作的,如果你可以使用LEMON Graph Library提供解决方案,那也没关系.
目前,我的顶点具有类型,Graph_Vertex*
并且可以具有void*
用于存储相关信息的关联指针.对于类型的边缘使用类似的逻辑Graph_Edge*
.我使用void*
指针来存储我自己的结构Node_State
,这是这样的
struct Node_State {
std::string name;
int id;
// other stuff
};
Run Code Online (Sandbox Code Playgroud)
从我看到的BGL到现在,我可以使用adjacency_list
结构和捆绑属性创建一个图表指向我的Node_State
.然后,我将使用整数顶点索引,而不是使用顶点指针.
我一直在寻找的教程和一些问题 在这里,这似乎是可能的.我在想类似的东西
typedef adjacency_list < listS, vecS, bidirectionalS, Node_State> gr;
Run Code Online (Sandbox Code Playgroud)
我会不时地从顶点移除所有边缘.非常不常见,我也可能删除一个节点.这就是我选择的原因listS, vecS
.
我想很容易为无向边创建这个结构的第二个版本.我不确定这是否bidirectionalS
是我案件的最佳选择.在这方面,您的意见是值得赞赏的.
但是还有另一个问题.现在,我可以使用外部地图按名称或使用唯一的整数id查找每个顶点.
std::map<int, Graph_Vertex*> nodes_by_id;
std::map<std::string, Graph_Vertex*> nodes_by_name();
Run Code Online (Sandbox Code Playgroud)
如果我删除一个顶点,我只需要删除地图中相应的条目,并且事情继续有效.
根据我的理解,使用BGL实现这一点并不容易,因为删除顶点会触发使用更高ID 重新编号所有顶点,并且还可能导致内部结构的重新分配.再见ids和再见指针.
主要问题. …
为了将shared_ptr分配给柠檬图库中的Graph类型变量,我这样做了:
typedef ListDigraph Graph;
typedef std::shared_ptr<Graph> Process_pointer;
Process_pointer process(new Graph);
Run Code Online (Sandbox Code Playgroud)
它运行正常,但现在我需要为地图对象声明一个shared_ptr,通常地图对象的工作方式如下:
Graph process;
typedef ListDigraph::NodeMap<string> Node_names;
Node_names name(process);
Run Code Online (Sandbox Code Playgroud)
也就是说,name需要Graph对象作为其默认构造函数.
为了声明一个shared_ptr,我这样做了:
typedef ListDigraph::NodeMap<string> Node_names;
typedef std::shared_ptr<Node_names> Nname_pointer;
Nname_pointer name = new Node_names;
name(process);
Run Code Online (Sandbox Code Playgroud)
我知道,名称的声明是错误的,但我如何分配内存以及用进程对象初始化它.
c++ ×4
graph ×3
boost-graph ×2
boost ×1
cmake ×1
coordinates ×1
eps ×1
indexing ×1
shared-ptr ×1