怎么修改的libboost dev

探索 Boost Graph Library - 为程序员服务
探索 Boost Graph Library
关于竞赛争辩的正义表达常日颇具争辩。然则,古代竞赛争辩最主要的理论支柱之一的图论并非这些正义表达之一。无数工程领域(从设计路由器和汇集到设计组成挪动配备焦点的芯片)都是图论的运用。
作为 C++ 运用轨范软件垦荒人员,我们常日需求直接将理想工程成就转化成一个等价的图论成就。假定有一个靠得住的基于 C++ 的通用图库,就可以匡助我们完成这个转换,这样的图库显著异常受迎接:Boost Graph Library (BGL) 将填补这项空白。
在本文中,您首先将树立一个无向图,然后依照样规的遍历例程树立一个有向图。随后,您可以运用一些经典算法,一切算法都不需求添加除夜量代码。这就是 BGL 的奇特之处。
下载和安装
BGL 可从 Boost 网站免费下载(请参阅 ,获得有关的链接)。BGL 是一个独一头文件的库,是以,往后在运用轨范代码中行使该库时,需求在源代码中包括相关的头文件。然则 BGL 需求这个序列化库来中止链接
。以下是一个范例的敕令行花招:
root# g++ test_bgl.cpp I/usr/boost/boost_1_44/ -L/usr/boost/boost_1_44/lib
假定要实行本文中的代码,您需求安装 Boost 1.44 版本。
邻接表(Adjacency lists)
任何图完成的头文件中都有一个邻接表 (adjacency list) 或邻接矩阵。 显示了在 Boost 头文件 adjacency_list.hpp 中若何声明邻接表。
清单 1. 在 Boost 中声明一个邻接表
template &class OutEdgeListS = vecS,
// a Sequence or an AssociativeContainer class VertexListS = vecS,
// a Sequence or a RandomAccessContainer class DirectedS = directedS,
class VertexProperty = no_property,
class EdgeProperty = no_property,
class GraphProperty = no_property,
class EdgeListS = listS&
class adjacency_list {
为了粗笨起见,我们将重点放在前三个模板参数。
OutEdgeList 模板参数决意了将用于存储边列表( edge-list)信息的容器类型。回想一下图论根蒂根抵常识就可以晓得,对有向图,只具有入边的那些极点都有一个对应的空邻接表。默许值被设置为 vecS,该值对应于 std::vector。VertexList 模板参数决意了用于泄漏表现该图极点列表的容器类型,默许值一样被设置为 std::vector。DirectedS 模板参数凭证供应的值是 directedS 照样 undirectedS 来一定该图是有向图照样无向图。
在 BGL 中树立一个图
在声明邻接表的同时, 中的代码在 BGL 中树立了一个庞杂的无向图,边信息将存储在 std::list 中,极点信息存储在 std::vector 中。
清单 2. 树立一个无向图
#include &boost/graph/adjacency_list.hpp&
typedef boost::adjacency_list&listS, vecS, undirectedS&
int main()
add_edge (0, 1, g);
add_edge (0, 3, g);
add_edge (1, 2, g);
add_edge (2, 3, g);
在清单 2 中,在没有在组织函数中供应任何极点或边信息的情形下树立了图 g。在运转的时辰,会行使诸如 add_edge 和 add_vertex 之类的匡助函数树立边和极点。add_edge 函数,望文生义:在一个图的两个极点之间添加一条边。清单 2 中的代码实行竣事后,图 g 理应有 4 个极点,分离符号为 0、1、2 和 3,极点 1 与极点 0 和极点 2 衔接,等等。
遍历图触及到行使 vertex_iterator 和 adjacency_iterator 类。前者遍历图的一切极点,后者遍历呼应邻接表。 展现了该代码。
清单 3. 行使 BGL 遍历图
#include &boost/graph/adjacency_list.hpp&
typedef boost::adjacency_list&listS, vecS, undirectedS&
int main()
add_edge (0, 1, g);
add_edge (0, 3, g);
add_edge (1, 2, g);
add_edge (2, 3, g);
mygraph::vertex_iterator vertexIt, vertexE
mygraph::adjacency_iterator neighbourIt, neighbourE
tie(vertexIt, vertexEnd) = vertices(g);
for (; vertexIt != vertexE ++vertexIt)
cout && *vertexIt && " is connected with ";
tie(neighbourIt, neighbourEnd) = adjacent_vertices(*vertexIt, g);
for (; neighbourIt != neighbourE ++neighbourIt)
cout && *neighbourIt && " ";
cout && "/n";
树立一个有向图
要树立一个有向图,只需求将
中的图类型改削为 directedS:
#include &boost/graph/adjacency_list.hpp& u
typedef boost::adjacency_list&listS, vecS, directedS&
int main()
add_edge (0, 1, g);
add_edge (0, 3, g);
add_edge (1, 2, g);
add_edge (2, 3, g); //
Same as Listing 3
匡助函数 vertices 前往一个 std::pair&vertex_iterator 和 vertex_iterator&,前者指向图的第一个极点。效果存储在多元组 tie (vertexIt, vertexEnd) 中,随后会行使 vertexIt 遍历该图。一样,匡助函数 adjacent_vertices 将会前往 std::pair&adjacency_iterator, adjacency_iterator&,第一个 adjacency_iterator 指向邻接表中的第一个元素。
设置配备铺排一个邻接表
BGL 的优势之一是它是高度可设置配备铺排的。BGL 准许您行使以下任何选择器类型来设置配备铺排极点集和边鸠合,这些选择器类型都是在头文件中界说的;您需求做的就是在声明图时行使它们:
vecS 选择 std::vector
lists 适用于 std::list
slistS 选择 std::slist
setS 选择 std::set
multiSetS 选择 std::multiset
hash_setS 选择 std::hash_set
假定代码中可以有许多极点拔出操作,但删除操作却不是太多,那末 VertexList 多是 vecS 或 listS。除向量需求再分配之外,push_back 常日是一个常量。假定您要实行许多拔出和删除操作,那末与 vecS 比照,listS 是一个不错的选择,因为从向量中删除一个元平凡日是价值昂贵的,而且很耗时。
树立无向图的其他一种方法
假定弗成使基于邻接表的方法树立无向图,那末您可以行使 BGL 供应的 undirected_graph 类(在 undirected_graph.hpp 中界说)树立该图。然则,该类在内部行使了一个邻接表,而且行使基于邻接表的图常日会供应更除夜的无邪性。 展现了有关代码。
清单 4. 行使 undirected_graph.hpp 树立一个无向图
#include &undirected_graph.hpp& #include &iostream& u
int main( )
undirected_graph&&g;
undirected_graph&&:vertex_descriptor u = g.add_vertex();
undirected_graph&&:vertex_descriptor v = g.add_vertex();
undirected_graph&&:vertex_descriptor w = g.add_vertex();
undirected_graph&&:vertex_descriptor x = g.add_vertex();
add_edge(u, v, g); add_edge(u, w, g); add_edge(u, x, g);
cout && "Degree of u: " && degree(u, g);
在清单 4 中,我行使 add_vertex 向图中添加自力的极点,行使 add_edge 向图中添加边。最初,经由进程挪用 degree 方法得出单个极点的度数。 供应了 undirected_graph 的声明和界说(来自 Boost 源代码)。
清单 5. 解密 BGL undirected_graph
template & typename VertexProp = no_property,
typename EdgeProp = no_property,
typename GraphProp = no_property& class undirected_graph
typedef adjacency_list&listS,
listS, undirectedS,
vertex_property,
edge_property,
GraphProp,
listS& graph_
private: graph_type m_ //
跟踪一个极点的入边(in-edges)和出边(out-edges)
可以行使 out_edges 匡助函数接见一个极点的出边,行使 in_edges 接见入边。BGL 的优势之一就是可以行使 cout 直接输出一条边,显示这条边衔接的极点。 展现了相关代码。
清单 6. 遍历有向图的极点
#include &boost/graph/adjacency_list.hpp& u
typedef boost::adjacency_list&listS, vecS, directedS&
int main()
add_edge (0, 1, g);
add_edge (0, 3, g);
add_edge (1, 2, g);
add_edge (2, 3, g);
mygraph::vertex_iterator vertexIt, vertexE
mygraph::in_edge_iterator inedgeIt, inedgeE
mygraph::in_edge_iterator outedgeIt, outedgeE tie(vertexIt, vertexEnd) = vertices(g);
for (; vertexIt != vertexE ++vertexIt)
cout && "incoming edges for " && *vertexIt && ": ";
tie(inedgeIt, inedgeEnd) = in_edges(*vertexIt, g);
for(; inedgeIt != inedgeE ++inedgeIt)
cout && *inedgeIt && " ";
cout && "/n";
for (; vertexIt != vertexE ++vertexIt)
std::cout && "out-edges for " && *vertexIt && : ;
tie(outedgeIt, outedgeEnd) = out_edges(*vertexIt, g); //
Similar to incoming edges
编译清单 6 中的极点将会泛起缺陷。要修复该缺陷,只需在 mygraph 声明中行使 bidirectionalS 取代 directedS。在 BGL 中行使 directedS 标签时,只准许您行使 out_edges 匡助函数和相关遍历。行使 in_edges 需求将图的类型更改成 bidirectionalS,虽然该图或多或少仍然是一个有向图。
留意:行使 in_edges 会发生发火额定的空间开支(与行使 directedS 比照,每条边成本增加了一倍),所以要确保该成本是您可以蒙受的。
一些有用的 BGL 函数
现在,我们来看一些 BGL 供应的之前我们并没有谈论过的主要适用函数。
您可以行使以下函数中止图接见:
std::pair&edge_iterator, edge_iterator& edges(const adjacency_list& g):前往图 g 中边的绝对应迭代轨范对
vertices_size_type num_vertices(const adjacency_list& g): 前往图 g 中极点的数目
edges_size_type num_edges(const adjacency_list& g):前往图 g 中边的数目
vertex_descriptor source(edge_descriptor e, const adjacency_list& g):前往一条边的源极点
vertex_descriptor target(edge_descriptor e, const adjacency_list& g):前往一条边的目的极点
degree_size_type in_degree(vertex_descriptor u, const adjacency_list& g):前往一个极点的入度 (in-degree)
degree_size_type out_degree(vertex_descriptor u, const adjacency_list& g):前往一个极点的出度 (out-degree)
显示了实行除夜量图接见的代码。
清单 7. 行使 BGL 中止图接见
// usual typedefs here, refer to previous listings
int main()
add_edge (0, 1, 8, g);
add_edge (0, 3, 18, g);
add_edge (1, 2, 20, g);
add_edge (2, 3, 2, g);
add_edge (3, 1, 1, g);
add_edge (1, 3, 7, g);
cout && "Number of edges: " && num_edges(g) && "/n";
cout && "Number of vertices: " && num_vertices(g) && "/n";
mygraph::vertex_iterator vertexIt, vertexE tie(vertexIt, vertexEnd) = vertices(g);
for (; vertexIt != vertexE ++vertexIt)
std::cout && "in-degree for " && *vertexIt && ": "
&& in_degree(*vertexIt, g) && "/n";
std::cout && "out-degree for " && *vertexIt && ": "
&& out_degree(*vertexIt, g) && "/n";
mygraph::edge_iterator edgeIt,
edgeE tie(edgeIt, edgeEnd) = edges(g);
for (; edgeIt!= edgeE ++edgeIt)
{ std::cout && "edge " && source(*edgeIt, g) && "--&"
&& target(*edgeIt, g) && "/n";
您可以行使以下代码来改削图:
void remove_edge(vertex_descriptor u, vertex_descriptor v, adjacency_list& g):从图 g 中删除一条边
void remove_edge(edge_descriptor e, adjacency_list& g):从图 g 中删除一条边
void clear_vertex(vertex_descriptor u, adjacency_list& g): 删除极点 u 的一切边
void clear_out_edges(vertex_descriptor u, adjacency_list& g):删除有向图 g 中极点 u 的一切出边(不适用于无向图)
void clear_in_edges(vertex_descriptor u, adjacency_list& g): 删除有向图 g 中极点 u 的一切入边(不适用于无向图)
void remove_vertex(vertex_descriptor u, adjacency_list& g): 从图 g 中删除一个极点(假定已行使 clear_vertex 或其他适合函数删除与该定极点相关的一切边。)
行使 BGL 树立一个有向加权图
现在,您理应已对有向图有所意见,下一个逻辑责任是行使 BGL 树立一个加权有向图。回想一下
中的邻接表声明,您会发明一个名为 EdgeProperty 的模板参数。您可以用这个模板参数来组织有向加权图。
property 是一个可分配给极点和边的参数。您可以行使一个标签名和一个与 property 相关的类型来界说该属性。BGL 有几个可用的标签名,个中包括 edge_weight_t 和 vertex_name_t。例如,要在图的极点中存储标签名,可以将一个 property
界说为 typedef property&vertex_name_t, std::string& VertexNameProperty,然后将该属性传递给图的模板声明中的 VertexProperty 参数。
这是一个边权重的 property
typedef property&edge_weight_t, int& EdgeWeightP
既然已树立了 EdgeWeightProperty,那末现在略微调解一下 mygraph 界说:
typedef boost::adjacency_list&listS,
vecS, directedS,
no_property,
EdgeWeightProperty&
最初,假定向图中添加边,则需求行使新加载的 add_edge,并收受接管权重作为第 3 个参数。 供应了完整的代码。
清单 8. 树立一个加权有向图
#include &boost/graph/adjacency_list.hpp& u
typedef property&edge_weight_t, int& EdgeWeightP
typedef boost::adjacency_list&listS, vecS, directedS, no_property,
EdgeWeightProperty &
int main()
add_edge (0, 1, 8, g);
add_edge (0, 3, 18, g);
add_edge (1, 2, 20, g);
add_edge (2, 3, 2, g);
add_edge (3, 1, 1, g);
add_edge (1, 3, 7, g);
BGL 中的最小生成树(spanning tree)
BGL 最超卓地方的就是丰除夜量可用于图的预界说算法:Kruskal、Prim、Dijkstra 等,但凡您说得出的,BGL 都有。改削
中的代码,从而具有一个具有加权边的无向图,然先行使 Kruskal 算法获得最小生成树,此时您就会邃晓我的意思了。BGL 将每一个算法放在不合的头文件中,是以,要行使 Kruskal 算法,必需包括 boost/graph/kruskal_min_spanning_tree.hpp 头文件。 展现了相关代码。
清单 9. 行使 Kruskal 算法获得最小生成树
#include &boost/graph/adjacency_list.hpp& //
typedef boost::adjacency_list&listS,
vecS, directedS, no_property, EdgeWeightProperty &
typedef mygraph::edge_descriptor E
int main()
add_edge (0, 1, 8, g);
add_edge (0, 3, 18, g);
add_edge (1, 2, 20, g);
add_edge (2, 3, 2, g);
add_edge (3, 1, 1, g);
add_edge (1, 3, 7, g);
std::list & Edge & spanning_
kruskal_minimum_spanning_tree (g, std::back_inserter(spanning_tree));
for (std::list & Edge &::iterator ei = spanning_tree.begin(); ei != spanning_tree.end();
cout && *ei && " ";
cout && "/n";
函数 kruskal_minimum_spanning_tree 在后台展现了它的奇特之处。它将图和迭代轨范归入存储边的容器中。请留意,spanning_tree 声明:我在这里行使了一个列表,但它可所以任何对象,好比一个极点。BGL 所关心的是第二个参数必需是 Standard Template Library (STL) 输出的迭代轨范类型。
行使 BGL 中止深度优先查找
宽度优先查找和深度优先查找是图遍历的症结,BGL 为这些操作供应了除夜量支持。需求包括的相关头文件是
boost/graph/depth_first_search.hpp;相关例程是 depth_first_search。BGL 供应多个 depth_first_search 接口;一切接口都需求将所谓的访客对象传递给该方法。
BGL 中的访客(visitor) 在 STL 中充任仿函数脚色,除此之外,它还可以做许多责任。访客没有 operator() 之类的单个方法,但可以无邪地界说几种方法,好比 initialize_index、start_index、discover_index 和 examine_edge。毫不强调地说,BGL 经由进程供应这些 hook 函数可以让您定制 DFS。首先我们看一个行使 DFS 的样例代码(拜见 )。
清单 10. 行使 BGL 的 DFS
#include &boost/graph/adjacency_list.hpp&
#include &boost/graph/depth_first_search.hpp&
#include &iostream&
typedef property&edge_weight_t, int&
EdgeWeightP
typedef boost::adjacency_list
& listS, vecS, undirectedS, no_property, EdgeWeightProperty&
class custom_dfs_visitor : public boost::default_dfs_visitor
{ public: template & typename Vertex, typename Graph &
void discover_vertex(Vertex u, const Graph & g)
const { std::cout && "At " && u && std:: }
template & typename Edge, typename Graph &
void examine_edge(Edge e, const Graph& g)
const { std::cout && "Examining edges " && e && std::
int main()
add_edge (0, 1, 8, g);
add_edge (0, 3, 18, g);
add_edge (1, 2, 20, g);
add_edge (2, 3, 2, g);
add_edge (3, 1, 1, g);
add_edge (1, 3, 7, g);
custom_dfs_
depth_first_search(g, visitor(vis));
清单 10 声清晰了了一个名为 custom_dfs_visitor 的类,这个类界说了两个 hook 函数:discover_vertex 和 examine_edges。前者在第一次碰着极点时挪用,后者在找到该极点之后在该极点的每一个出边上挪用。
是以,假定在访客 (vis) 中将 vis 的类型设置为 boost_default_visitor,会发生发火什么呢?是的,您猜对了:什么都不会显示。 显示了 BGL 供应的 hook 函数的一个庞杂概述。
表 1. 行使 DFS 中止遍历的 BGL hook 函数
start_vertex(u, g)
在最先遍历之前挪用源极点
discover_vertex(u, g)
第一次挪用极点时挪用
finish_vertex(u, g)
假定 u 是一个树的根节点,则在挪用该树上其他一切元素之后挪用 finish_vertex。假定 u 是一个叶子节点,则在完成 u 一切出边的搜检之后挪用该方法。
examine_edge(u, g)
找到极点 u 后,挪用其每一个出边
tree_edge(u, g)
当一条边成为查找树的边时挪用
back_edge(u, g)
挪用一个图的回边(back edges);用于无向图,因为 (u, v) 和 (v, u) 是不合条边,所以 tree_edge 和 back_edge 均被挪用
请留意,BGL 还支持其他访客,好比 dijkstra_visitor、bellman_visitor 和 astar_visitor。
以上就是本文内容,我们进修了若何在 BGL 中树立无向图、有向图和加权图;还意见了存取函数和接见函数,并在您树立的图上考试考试完成了一些经典图算法。BGL 供应的远远不止这些,本文只触及一点外相。请务必查阅 BGL 文档,获得有关的具体信息。
原文地址:, 感谢原作者分享。
您可能感兴趣的代码Boost下载安装编译配置使用指南_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Boost下载安装编译配置使用指南
上传于||暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
你可能喜欢新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
UID空间积分0 积分948阅读权限20帖子精华可用积分948 信誉积分184 专家积分0 在线时间616 小时注册时间最后登录
丰衣足食, 积分 948, 距离下一级还需 52 积分
帖子主题精华可用积分948 信誉积分184 专家积分0 在线时间616 小时注册时间最后登录
论坛徽章:1
今天装libtorrent-rasterbar-0.14.10,编译的时候需要boostlib,如下:checking for boostlib &= 1.35... no
checking for boostlib &= 1.34... configure: error: We could not detect the boost libraries (version 1.34 or higher). If you have a staged boost library (still not installed) please specify $BOOST_ROOT in your environment and do not give a PATH to --with-boost option.&&If you are sure you have boost installed, then check your version number looking in &boost/version.hpp&. See http://randspringer.de/boost for more documentation.复制代码编译安装完boost,如下:The Boost C++ Libraries were successfully built!
The following directory should be added to compiler include paths:
& & /Data/software/boost_1_43_0
The following directory should be added to linker library paths:
& & /Data/software/boost_1_43_0/stage/lib复制代码再去编译libtorrent-rasterbar-0.14.10,问题依旧。路径分别导入到了C_INCLUDE_PATH和LIBRARY_INCLUDE_PATH,也都export了,但还是有问题。
环境:[root@lee-Linux libtorrent-rasterbar-0.14.10]# uname -a
Linux lee-Linux 2.6.18-194.el5xen #1 SMP Tue Mar 16 22:01:26 EDT
x86_64 x86_64 GNU/Linux复制代码[root@lee-Linux libtorrent-rasterbar-0.14.10]# gcc --version
gcc (GCC) 4.1.2
(Red Hat 4.1.2-48)
Copyright (C) 2006 Free Software Foundation, Inc.
本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保;
包括没有适销性和某一专用目的下的适用性担保。复制代码google了挺长时间,也没有解决。
不知道各位能不能给点儿帮助,谢谢了。
本来想搞个Michael的发型,理完发后一看,像 T-bag
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
UID空间积分0 积分1341阅读权限30帖子精华可用积分1341 信誉积分144 专家积分0 在线时间378 小时注册时间最后登录
家境小康, 积分 1341, 距离下一级还需 659 积分
帖子主题精华可用积分1341 信誉积分144 专家积分0 在线时间378 小时注册时间最后登录
论坛徽章:0
UID空间积分0 积分193阅读权限10帖子精华可用积分193 信誉积分182 专家积分0 在线时间346 小时注册时间最后登录
白手起家, 积分 193, 距离下一级还需 7 积分
帖子主题精华可用积分193 信誉积分182 专家积分0 在线时间346 小时注册时间最后登录
论坛徽章:0
If you have a staged boost library (still not installed) please specify $BOOST_ROOT in your environment and do not give a PATH to --with-boost option.
UID空间积分0 积分948阅读权限20帖子精华可用积分948 信誉积分184 专家积分0 在线时间616 小时注册时间最后登录
丰衣足食, 积分 948, 距离下一级还需 52 积分
帖子主题精华可用积分948 信誉积分184 专家积分0 在线时间616 小时注册时间最后登录
论坛徽章:1
beyond_touch
& & $BOOST_ROOT,不知道在哪儿设置啊,能不能给个提示?
这个我也发现了,只是不知道去哪里设置
本来想搞个Michael的发型,理完发后一看,像 T-bag
UID空间积分0 积分18609阅读权限90帖子精华可用积分18609 信誉积分214 专家积分20 在线时间938 小时注册时间最后登录
大富大贵, 积分 18609, 距离下一级还需 1391 积分
帖子主题精华可用积分18609 信誉积分214 专家积分20 在线时间938 小时注册时间最后登录
论坛徽章:0
export BOOST_ROOT=/Data/software/boost_1_43_0
然后再试试进到libtorrent-rasterbar-0.14.10里面./configure
不过还是建议你先在boost下面bjam stage install安装一下boost库到系统目录,毕竟/Data/software/boost_1_43_0/stage/lib不是标准库目录,将来运行程序时也麻烦。
UID空间积分0 积分22阅读权限10帖子精华可用积分22 信誉积分48 专家积分0 在线时间14 小时注册时间最后登录
白手起家, 积分 22, 距离下一级还需 178 积分
帖子主题精华可用积分22 信誉积分48 专家积分0 在线时间14 小时注册时间最后登录
论坛徽章:0
这个问题解决了吗?我也碰到了,忘不吝赐教,谢谢。下次自动登录
现在的位置:
& 综合 & 正文
Ubuntu编译安装boost并在eclipse C/C++中使用/Boost安装和卸载
Boost安装和卸载
一、Ubuntu编译安装boost并在eclipse C/C++中使用
source : /Linux/90.htm
1.从boost官网下载boost 1.46.1
2.执行 apt-get install build-essential
(目的是为了安装好象gcc,g++等一些工具进行编译)
注:我是在root用户下进行的操作,普通用户执行 sudo apt-get install build-essential
3.解压boost库到/usr/share/
將下载好的boost 1.46.1.tar.gz(我用的是这个版本) 复制到/usr/share/ 目录下,然后解压,会自动生成一个boost_1_46_1这个文件夹(或者用命令解压,这里就不提了,可以自己去查解压命令)
4.编译bjam(这个东东是用来编译boost库的)
编译之前先做如下操作,由于这版本是编译msvc版的bjam,我们把它改成gcc版的bjam......
进入boost1.46.1解压目录找到bootstrap.bat 用记事本打开,然后修改:
第13行將call .\build.bat & ..\..\..\bjam.log
改为call .\build.bat gcc & ..\..\..\bjam.log
第33行將set toolset=msvc改为set toolset=gcc
保存退出,然后双击 bootstrap.sh在终端中执行,稍等片刻会在boost_1_46_1中生成bjam
5.编译boost库: 在终端中进入/usr/share/boost_1_46_1目录
在终端中输入 cd /usr/share/boost_1_46_1
然后我在root用户下输入 ./bjam toolset=gcc --layout=tagged --build-type=complete stage 进行完全编译
(普通用户的话执行: sudo./bjam toolset=gcc --layout=tagged --build-type=complete stage
经过漫长的等 待,命令执行完毕后,将会生成所有版本的库,并存储在:
/usr/share/boost_1_46_1/stage 下
6.boost 已经编译好了,下面调用boost库
1.在/usr/include/下生成一个boost库的include文件夹连接:
ln -s /usr/share/boos t_1_46_1/boost /usr/include/boost
2.在/usr/lib/ 下生成所有boost编译出的lib库文件的对应连接 切换到stage目录下,执行
find $PWD/lib/*.* -type f -exec ln -s {} /usr/lib/ \;
(普通用户执行: sudo find $PWD/lib/*.* -type f -exec ln -s {} /usr/lib/ \;)
执行完以上操作就算ok了
这不是一篇向导,全面的向导请看 (http://goo.gl/XcAf)。
这仅是一篇笔记。这里用 进行编译。
下载boost。(http://cdnetworks-kr-1.dl.sourceforge.net/project/boost/boost/1.42.0/boost_1_42_0.tar.bz2)
解压到指定文件夹,我是将它解压到根目录下的一个sourcecode文件夹下。
/home/volnet/sourcecode/boost_1_42_0
启动终端(ctrl+f2,输入“gnome-terminal”)。生成bjam脚本。
./bootstrap.sh --prefix=/home/volnet/sourcecode/boost_install
如果不带--prefix参数的话(推荐 ),默认的路径是/usr/local/include和/usr/local/lib
./bootstrap.sh
使用--help参数可以查看帮助,用-h可以查看简要帮助。
./bootstrap.sh --help
生成脚本bjam,已经存在的脚本将被自动备份。
@:~/sourcecode/boost_1_42_0$ ./bootstrap.sh --prefix=/home/volnet/sourcecode/boost_install/
Building Boost.Jam with toolset gcc... tools/jam/src/bin.linuxx86/bjam
Detecting Python version... 2.6
Detecting Python root... /usr
Unicode/ICU support for Boost.Regex?... /usr
Backing up existing Boost.Build configuration in project-config.jam.4
Generating Boost.Build configuration in project-config.jam...
Bootstrapping is done. To build, run:
To adjust configuration, edit 'project-config.jam'.
Further information:
- Command line help:
./bjam --help
- Getting started guide:
http://www.boost.org/more/getting_started/unix-variants.html
- Boost.Build documentation:
http://www.boost.org/boost-build2/doc/html/index.html
今天在Ubuntu下安装了boost,非常简单。参考:www.boost.org/doc/html/bbv2/installation.html
只不过Ubuntu的原因,如果写系统目录,需要用sudo执行:
$./bootstrap.sh
$sudo ./bjam install
如果是需要支持mpi,在执行了./bootstrap.sh后,需要修改文件project-config.jam ,添加
# MPI configuration
当然,首先保证已经安装了mpich2或openmpi。然后在第2行执行:
$./bjam --with-mpi
默认将头文件安装在/usr/local/include,库文件安装在/usr/local/lib
卸载也很简单,直接将以上两个目录中有关boost的内容删除就可以了
三、Ubuntu下Boost、BLAS、Lapack及CGAL安装
http://hhfighting./blog/static//
1,首先安装Boost,下载最新的boost ,解压到某个目录
首先,安装Boost之前,需要做一些准备工作:
安装g++:sudo apt-get install g++
为了更完整的编译boost,需要下载额外的软件包,比如要完整编译boost-python库需要下载python2.6-dev,正则库regex需要
unicode/icu,boost.iostreams库需要zlib1g-dev,相关命令如下琐事:
sudo apt-get install python2.6-dev(根据当前的版本进行选择)
sudo apt-get install libicu-dev
sudo apt-get install libbz2-dev
没安装上述库的出现的错误信息:
运行 ./bootstrap.sh 出现“Unicode/ICU support for Boost.Regex?....not found”,此错误的解决办法就是安装libicu-dev。
接着,要编译生成boost安装工具bjam
进入boost目录执行:(前两句是为相关文件添加执行权限)
chmod +x bootstrap.sh
chmod +x ./tools/build/v2/engine/build.sh
./bootstrap.sh
如果没有前两句的设置权限,否则会出现如下错误
./bootstrap.sh: 210: ./tools/build/v2/engine/build.sh: Permission denied
Building Boost.Build engine with toolset …
Failed to build Boost.Build build engine
Consult ‘bootstrap.log’ for more details
然后,执行刚生成的
./bjam install --prefix=/usr/local
//指定了安装路径
install会安装头文件和库文件到相应指定目录,头文件安装到/usr/local/include下,库文件安装到/usr/local/lib下。具体指定安装目录见
/bjam –help。
此外,也可以使用./bjam stage
stage说起来只能说是收集生成的库文件到一个目录下,通常默认就在./stage下。
注意:若编译过程中未指定install或stage,则生成的目标库文件只存在于–build-dir所指的目录中,默认为./bin.v2。考虑到此,若无需将头文件和库文件安装,则推荐使用stage关键字。
编译开始,大约半小时,全部编译结束。
2,测试boost安装
1)使用不需要编译的库 timer 库
#include &boost/timer.hpp&
#include &iostream&
int main()
std::cout && "boost lib [timer] test code..."&& std::
std::cout && "max timespan:" && t.elapsed_max() / 3600 && "h" && std::
std::cout && "min timespan:" && t.elapsed_min() && "s" && std::
std::cout && "now time elapsed:" && t.elapsed() && "s" && std::
g++ -o a.out timer_test.cpp
结果如下:
boost lib [timer] test code...
max timespan:0.59652h
min timespan:1e-06s
now time elapsed:0.01s
说明成功使用了boost库函数。
2)使用regex库
#include &boost/regex.hpp&
#include &iostream&
int main()
std::cout && "boost lib [regex] test code..." && std::
boost::regex reg("");
不加-l参数时编译出错:
g++ -o regex regex_test.cpp
加-l参数时不出错:
g++ -o regex regex_test.cpp -lboost_regex
运行结果:
boost lib [regex] test code...
至此,boost环境就编译测试完毕,以后可以在此环境上学习boost的其它库的用法,进而将他们应用到自己的工作当中,尽量提高工作效率,降低开发成本。
4,安装Lapack
安装lapack最主要的是如何修改 make.inc,具体操 作如下:
先将下载的文件解压缩:tar xvzf lapack-3.4.0.gz
移动文件到制定目录:sudo mv lapack-3.4.0 /usr/local/
安装编译器及相关库文件:sudo apt-get install gfortran
sudo apt-get install libblas-dev
建立make.inc文件: cp make.inc.example make.inc
编辑make.inc文件:gedit make.inc
红色部分为修改部分
............
= gfortran -fimplicit-none -g
//此参数是编译器的版本 根据机器具体安装的编译器来设置
= gfortran -g
LOADOPTS =
..............
修改makefile文件:gedit Makefile (如果安装了BLAS,此步就不需要进行了)
修改内容如下:(由于事先没有安装BLAS,所以需要对blas进行编译)
lib: lapacklib tmglib
#lib: blaslib variants lapacklib tmglib
#lib: lapacklib tmglib
lib: blaslib variants lapacklib tmglib
编译文件:make
编译出现以下错误:
./lapack_testing.py
make: execvp: ./lapack_testing.py: 权限不够
make: *** [lapack_testing] 错误 127
授予权限:chmod +x lapack_testing.py
然后再make,运行正常。
最后,复制liblapack.a 、 librefblas.a、
libtmglib.a三个文件到/usr/lib和/usr/local/lib两个文件夹中。
Now, only generate static library(.a). I want to generate dynamic library(.so), how to do ?
reference:
http://icl.cs.utk.edu/lapack-forum/viewtopic.php?f=2&t=908
4,安装CGAL
&&&&推荐文章:
【上篇】【下篇】

我要回帖

更多关于 libboost 的文章

 

随机推荐