说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Windows和Linux环境中Boost下载安装编译配置使用指南

HTML文档下载 WORD文档下载 PDF文档下载
本文是关于Boost编译最详细的文章,刚接触Boost的同学可以以此为参考。

 

作者:Terry Wang

 

[编者:本文是关于Boost编译最详细的文章,刚接触Boost的同学可以以此为参考。]

目前我已对boost的安装和使用有了新的认识,因此也会对两年前写的这篇文章做大幅修改,网上转载版本泛滥,请以本文为准。

 

理论上,本文适用于boost的各个版本,尤其是最新版本1.47.0;适用于各种C++编译器,如VC6.0(部分库不支持),VS2003,VS2005,VS2008,VS2010,gcc,C++ Builder等。先总结一下Windows系统。

一、下载

首先从boost官方主页http://www.boost.org/下载最新版boost安装包,或者使用Subversion获取最新版本,地址是:http://svn.boost.org/svn/boost/trunk。本人现在一般都用svn,这样可以很方便的进行update和build,而不是每次都下载新的安装包并rebuild。

二、安装

如果是使用下载的安装包,那么请将boost安装包解压至本地目录,如:E:\SDK\boost;如果是用svn的,也可以将boost的代码checkout到这个目录。因为boost一部分类是需要编译成库才能使用的,所以我们还需要准备好boost专用的编译辅助工具bjam。在命令提示符(cmd.exe)中执行根目录下的bootstrap.bat,编译后的bjam.exe会自动拷贝到该目录下(bjam必须与boost-build.jam在同级目录)。

三、编译

接下来就是最重要的编译步骤了。需要打开命令提示符(cmd.exe)窗口并执行bjam,可以使用--help参数来查看命令帮助。这里详细讲解一下bjam的命令行参数,因为它非常重要。首先,它涉及到编程环境的搭建,你需要根据自己今后具体的使用环境来选择合适的命令行参数;其次,它影响到你的硬盘空间,完全编译的话据说在3G以上,如果你同时拥有2个以上的IDE(如VC6和VC9共存)而且都要用到boost,那么占用多少硬盘就自己算吧……虽说如今大家的硬盘空间都不成问题,但就像本人一样崇尚合理利用资源不习惯铺张浪费提倡节俭的童鞋应该大有人在,所以不需要的配置和不需要的库就可以不编译了。综合以上两点因素,本人使用的bjam命令如下:

 

bjam stage --toolset=msvc-9.0 --without-graph --without-graph_parallel --without-math --without-mpi --without-python --without-serialization --without-wave --stagedir="E:\SDK\boost\bin\vc9" link=static runtime-link=shared runtime-link=static threading=multi debug release

 

下面详细解释一下每个参数的含义:

stage/install:stage表示只生成库(dll和lib),install还会生成包含头文件的include目录。本人推荐使用stage,因为install生成的这个include目录实际就是boost安装包解压缩后的boost目录(E:\SDK\boost\boost,只比include目录多几个非hpp文件,都很小),所以可以直接使用,而且不同的IDE都可以使用同一套头文件,这样既节省编译时间,也节省硬盘空间。

toolset:指定编译器,可选的如borland、gcc、msvc(VC6)、msvc-9.0(VS2008)等。

without/with:选择不编译/编译哪些库。因为python、mpi等库我都用不着,所以排除之。还有wave、graph、math、regex、test、program_options、serialization、signals这几个库编出的静态lib都非常大,所以不需要的也可以without掉。这可以根据各人需要进行选择,默认是全部编译。但是需要注意,如果选择编译python的话,是需要python语言支持的,应该到python官方主页http://www.python.org/下载安装。查看boost包含库的命令是bjam --show-libraries。

stagedir/prefix:stage时使用stagedir,install时使用prefix,表示编译生成文件的路径。推荐给不同的IDE指定不同的目录,如VS2008对应的是E:\SDK\boost\bin\vc9,VC6对应的是E:\SDK\boost\bin\vc6,否则都生成到一个目录下面,难以管理。如果使用了install参数,那么还将生成头文件目录,vc9对应的就是E:\SDK\boost\bin\vc9\include\boost-1_46\boost,vc6类似(光这路径都这样累赘,还是使用stage好)。

build-dir:编译生成的中间文件的路径。这个本人这里没用到,默认就在根目录(E:\SDK\boost)下,目录名为bin.v2,等编译完成后可将这个目录全部删除(没用了),所以不需要去设置。

link:生成动态链接库/静态链接库。生成动态链接库需使用shared方式,生成静态链接库需使用static方式。一般boost库可能都是以static方式编译,因为最终发布程序带着boost的dll感觉会比较累赘。

runtime-link:动态/静态链接C/C++运行时库。同样有shared和static两种方式,这样runtime-link和link一共可以产生4种组合方式,各人可以根据自己的需要选择编译。一般link只选static的话,只需要编译2种组合即可,即link=static runtime-link=shared和link=static runtime-link=static,本人一般就编这两种组合。

threading:单/多线程编译。一般都写多线程程序,当然要指定multi方式了;如果需要编写单线程程序,那么还需要编译单线程库,可以使用single方式。

debug/release:编译debug/release版本。一般都是程序的debug版本对应库的debug版本,所以两个都编译。

 

本人按以上方式分别编译了静态链接和动态链接两个版本后,整个E:\SDK\boost目录有1.28G。如果不打算将来再升级boost版本,那么可以将编译生成的中间文件bin.v2目录删除,这样整个目录(包括安装包解压缩文件和编译生成的库文件)会减小至不到800MB,如果runtime-link只选了一种方式,那么整个目录只有600MB。事实上编译完成后除了boost和bin目录之外其他目录和文件已经可以删除了,这样还可以腾出350MB的空间来。不过我又研究了一下,其实libs这个目录也很有用,它提供了所有Boost类的使用范例,平时可以作为参考;另外doc目录是一个完整的boost使用帮助文档,当然最好也不要删了。其他几个目录和文件加起来也就几十兆,索性都给它们留一条生路吧。

呵呵,一个完整而又完美的boost目录就此诞生了。

需要注意的是,如果使用VS2008编译boost(其他版本VC未作测试,可能也有类似问题),那么假如你调用boost的主程序添加了_BIND_TO_CURRENT_VCLIBS_VERSION预定义宏来强制使用最新版本的Windows CRT库,那么你的boost也需要添加这个预定义宏来进行编译,否则会导致程序因为各模块使用的CRT库版本不统一而出现“在某些机器上运行提示‘由于应用程序配置不正确,应用程序未能启动’的问题”,关于该问题请参考我的另外一篇文章:【原】解决VS2008编译的程序在某些机器上运行提示“由于应用程序配置不正确,应用程序未能启动”的问题。添加该预定义宏的方法是:打开boost安装根目录下的boost\config\compiler\visualc.hpp,在最上面增加:

// Added by terry, 2011/4/19, Force the linker to use the latest version of CRT/MFC/ATL dll

#ifndef _BIND_TO_CURRENT_VCLIBS_VERSION

#define _BIND_TO_CURRENT_VCLIBS_VERSION    1

#endif // _BIND_TO_CURRENT_VCLIBS_VERSION 

 

这种方法修改了boost的源码,并非我所愿, 但是无奈没有找到更好的方法,如果有人知道希望能够留言告诉我。

如果图省事,不想了解这么多,那么有简单的方法,可以使用命令:

bjam --toolset=msvc-9.0 --build-type=complete

直接指定编译器以完全模式编译即可,这样可以满足今后的一切使用场合,但同时带来的后果是:

1、占用3G以上的硬盘空间

2、占用若干小时的编译时间

3、头文件和库文件存放于C:\Boost(本人非常反感)

4、生成的很多文件可以永远也用不上

四、配置

include目录:E:\SDK\boost

library目录:E:\SDK\boost\bin\vc9\lib

添加到IDE相应的路径下面即可。

五、使用

使用举例:

#include <boost\thread.hpp>

此时,不用包含库文件,boost的auto-link机制将会自动帮我们包含对应的静态lib。也就是说,boost默认是以静态方式链接的,这样我们的工程属性最好也设为Multi-threaded (Debug)。如果想使用dll动态方式链接,需要预先定义宏:

#define BOOST_ALL_DYN_LINK

同样,此时boost也会默认帮我们包含对应的lib。如果不想使用boost提供的auto-link机制,或者对它的自动链接不太放心的话(其实大可不必担心),可以预先定义宏:

#define BOOST_ALL_NO_LIB

然后使用以下方法链接:

#pragma comment(lib, "boost_thread-vc90-mt-1_47.lib")

#pragma comment(lib, "boost_thread-vc90-mt.lib")

这两个lib其实是一样的,实在不明白boost编译时为什么每个库都要复制一份,难道是因为后者在升级boost版本后不用改代码?另外还有一个比较有用的宏:

#define BOOST_LIB_DIAGNOSTIC

它可以让VC在编译时的output窗口中输出程序具体链接了哪些boost库以及链接顺序。

关于boost的auto-link机制,详细可以看看boost\config\auto_link.hpp里的代码,很容易可以读懂,并且值得我们学习。

六、Linux下编译与配置的区别:

我的Linux与Windows使用了共享目录,将Windows下的E:\SDK目录映射成了Linux下的/mnt/hgfs/sdk目录。

所以我的boost源文件根目录就是/mnt/hgfs/sdk/boost,cd进去。

首先需要编译bjam:

 

./bootstrap.sh

 

编译完成后,会在当前目录下生成bjam,接下来开始编译boost:

 

./bjam stage --toolset=gcc --with-date_time --with-thread --with-filesystem --with-program_options --stagedir="/mnt/hgfs/sdk/boost/bin/gcc" link=static runtime-link=static threading=multi debug release

 

这些参数的意义与Windows下完全一样,只不过编译器改成gcc,其他选项根据自己的需要进行设置。

生成的库文件就在bin/gcc/lib目录下,与vc9编译的一样。

如果将来不会再升级boost版本,那么可以把中间文件全部删掉,包括bin.v2目录和tools/jam/stage目录。

关于boost库的使用,为了不用每次写makefile都把boost的头文件和库文件的路径带着,而且为了让跨平台程序公用一套代码,

可以将boost的头文件和库文件路径加到Linux的环境变量中。打开/etc/profile,加入以下gcc环境变量: 

 

CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:"/mnt/hgfs/sdk/boost"

export CPLUS_INCLUDE_PATH

 

LIBRARY_PATH=$LIBRARY_PATH:"/mnt/hgfs/sdk/boost/bin/gcc/lib"

export LIBRARY_PATH

 

这样就可以直接使用boost的头文件和库文件了,并且与Windows共用一套代码,非常方便。

七、可参考的网上流行的几篇文章:

白话C++之安装boost:http://www.d2school.com/bhcpp_book/2_5.php

Windows VC6编译安装Boost库:http://blog.csdn.net/weekly123/archive/2007/11/23/1899188.aspx

boost编译步骤:http://blog.csdn.net/aheroofeast/archive/2009/03/22/4015458.aspx

boost 1.35.0 Visual Studio 2008编译指南:http://blog.csdn.net/benjiamen/archive/2008/07/12/2643705.aspx

VS2008下安装boost:http://www.cnblogs.com/xdotnet/archive/2008/03/22/boost_install_config.html

 

本文转载自:http://www.cnblogs.com/wondering/archive/2009/05/21/boost_setup.html

Google无人驾驶汽车与机器人组合,秒杀无人机 Google欲推新Chrome应用:适用于Android、iOS平台 comScore:美国市场苹果手机独占鳌头 Android和iOS双寡头垄断 一周消息树:新技术实现远程触摸和操纵实物 创新人机交互 研发周报:帮助网站转换的六大黑色星期五规则 【开源专访】JFinal作者詹波:以极简方式实现Web项目的极速开发 2013中国智能交通与大数据技术峰会:迎接交通大数据新时代 大数据应用技术(上):加速创新,重塑世界 英特尔百度携手推出首个跨平台应用商店 12月9日:计算机软件第一夫人Grace Hopper出生 触摸屏将成笔记本标配 电脑行业或将迎来又一春 触摸4G,你必须要知道的那些事儿 TIOBE 2013年12月编程语言排行榜:Transact-SQL冲刺年度语言 敏捷开发的6个实战经验 【图文】走近华为企业业务与支撑万人技术团队的云数据中心 《习惯联盟》陈晓冬:与京东云合作让我们没有后顾之忧 流计算与批处理同现:畅享大数据时代的开源实践 挑战和机遇并存:大数据时代机器学习与可视化 【企业开源系列】收发一条Twitter推文的背后 在IE11中更快地获得您需要的内容 暴露程序员身份的8个行为 英特尔创新应用大赛大评审!创新也有中国风 苹果面临一问题:正源源不断地失去优秀工程师 初学编程者必知的五个网站 大数据基准测试专题论坛:基准测试是一把尚未完成的尺子 大数据应用(下):应用驱动技术,DaaS创造价值 大数据研究与发展专题论坛:大数据在各领域中的应用及发展策略 雅虎新目标:欲收购照片分享网站Imgur 移动开发工具访谈《近匠》第01期:七牛云存储—BaaS进化论 ShareSDK:A轮融资到位!将推社会化评论SDK 70美元,你也能用Raspberry Pi做个专属iBeacon基站 谁有瑞星的升级程序,或是授权ID什么的?现在瑞星升级很烦啊!又是注册,又是授权的。 好象很少有人讨论日志文件的,能介绍点好的website吧(国内外均可)谢了先 Ghost之后,20G只剩下一个2G的C:!!!如何恢复,请指教,多谢!!! 我是初学者,问一个比较傻的问题:既然JAVA是一种纯面向对象的语言,那么为什么int i=new int()或int i=new int(1)不能通过编译?谢谢。 哪位能讲解一下,WEB服务器启动一个PHP 脚本的过程? 哪位朋友有没有做过让asp自动生成 Access数据库中的一张表 现想做一模块,主要是对股票数据在网络(包括公司内部网或是INTERNET)进行实时的发送; 关于DcomConnection的一个问题:连接局域网其他机器的应用程序服务器时“拒绝访问” 在VisData中正常通过,但在程序中不能通过,为什么 图像的小波分解和重构,模极大值算法。 师傅不在QQ,在这里吗?有个问题.//小新的徒弟. 老千,上次的那个rose下载网站,你还记得吗?偶忘了,搜索了几遍野没找到//牛虻 在VisData中正常通过但在程序中不能通过,为什么 向各位高手请教两句:tab_1.post selecttab(3) 的作用是不是向tab发送消息,消息内容是selecttab(3)?yield()是不是从消息中查找是否有相同消息,如果有则将它拿出执行? 我很莱,谁能给我简单的解释一下线程是什么?脱壳是什么? 图象资料,轻而易举30分! 和大家交流一下泛型化编程 文件拷贝的简单问题, 大家好:请问:access的mdb数据库如何编程知道里面含有那几个表? 怎样将mysql驱动加到jbuilder中,让Database pilot能认得出,高分相送 高分求教:关于ADO实现数据库!!!!!!!!!!谢谢 请问如何一次删除数据库中的所有数据? 怎么使label框透明!帮帮我! TNMUDP问题:怎样才能知道RemoteHost连接失败??? 谁有CuteFTP Pro2.0注册码?谢谢 如何进行DropDownList绑定,谢谢! 请问一个CString的问题 那个168查分台太可恶了 WIN98与WIN2000共享一个OFFICE??? 网络连接怎么检测 能把IE浏览器最大吗?俺指的是把右上最大按钮最大化? 怎么判断表单传送的整数中不能有字符,谢谢!!! 如何把我写好的说明书放到我VC++应用程序的帮助文件中? 求最容易理解,最容易上手的数据库书籍,各位老大请指教,谢谢!! 快!快快!!来拿分呀!!!!!!!!一个简单问题。 WIN98与WIN2000共享一个OFFICE 2000??? 在Servlet中如何使用JavaBean(调用其中的方法)?主要是格式!如果网上有这方面的资料也可以告诉我,我急用,不胜感激!40分送上!(只有这些了) 请问各位:怎样才能知道某一个进程所占用的cpu比例,mem大小? 请问在恢复sql 7.0一个数据库文件时,出现Error 3624:这是什么意思?? 关于程序员考试 哪位知道怎么一行一行地读取文本文件呀!!!! 谁知道的,来帮我一下——有关网页浏览计时的问题 如何将数字变为字符串格式化输出? Websphere下使用连接池的一些问题 TNMUDP问题:怎样才能知道RemoteHost连接失败 ? 算法请教,我要调整一副黑白数字图的浓度,我是用直方图的方法好呢,还是先转成HLS在转回来好?若都不对,应该怎么做? 如何 在ASP中用ping 一个小问题 请用javascript VC++6是98年才出来的,为什么没有最新的ADO原生驱动,而通过ODBC的话速度太慢; 多媒体 谁有MPEG-4的资料! 汽车档位上的N,R,S,宝马550i上的当就这么写的, 电动车开关在电瓶上怎么安装 滚动摩擦力的大小不是求有哪些因素和滚动摩擦力有关,而是问:摩擦力的大小和拉力是否有关.比如用10N的力去拉以物体和用5N的力去拉它,摩擦力是否一样. 汽车档位上的N,R,S, 电动车电池怎么装 滚动摩擦的摩擦力大小与什么有关?如题 现代汽车上的三元催化剂中的“三元”是何含义 电动车可以多装个电瓶吗想电动车能跑的更远点 有没有什么好的办法 能不能多加个电瓶 怎么操作呢?对车子会不会有影响 摩擦力的大小与物体的运动方式有关,对于相同的物体,滚动的摩擦力_,滑动的摩擦力_. SMC 电磁阀 型号SMC VK332-5DZ-01字母和数字分别代表什么意思?还有国产的什么型号能代替这个? 汽车s档是什么意思 一辆汽车在高速公路上的行驶速度是八十千米每时,在107国道上行驶的速度是高速公路上的四分之三,在108国道上行驶速度是在107国道上的三分之一,这辆汽车在108国道上的行驶速度是多少千米 SMC 二位三通电磁阀功能问题个人理解二位三通电磁阀只能控制流体的通断或者换向功能.阀芯也应该是由电磁线圈的得电与失电控制其运动达到电磁阀功能的.但是今天一位老师傅跟我说得电 小车s档,在什么情况下使用? 一辆汽车在高速公路上b小时行驶了360千米,在普通公路上的速度是每小时t千米.360除以b表示( );360除以b减t表示( ). 一辆小汽车有静止出发做匀加速直线运动,用10s时间通过一座长140m的平直桥,过桥后速度为16m/s.问1 它刚上桥是的速度有多大?2 桥头与出发点相距多远? 汽车轮胎规格185/60R14是什么意思?其中的185、60、R、14分别代表什么意思啊? 北汽新能源的E150EV电动汽车能开多少公里? 某小汽车质量为500kg,在1200N的牵引力作用下,从静止开始运动,经过10s速度可达到20m/s,若将小汽车的启动的过程,所受阻力恒定,求:(1)启动过程的加速度大小(2)所受阻力多大(3)启动后,经 汽车轮胎的型号185/65/14,185/65/14与185/60/14两种型号有何不同?请指教, E150EV充电需要多长时间啊?北汽新能源那个纯电动车 一辆轿车从车站由静止出发做匀加速直线运动,经10s速度达到108km/h,它的加速度是——谢谢了, 缸径63-行程150的标准气缸,两端有调速阀,外接3位5通电磁阀,怎么控制? 一辆客车在某高速公路上行驶 在经过某直线路段时已知函数y=x/a+1开根号(a<0且a为常数)在区间(-无穷,1】上有意义,求实数a的值 要求必须要有格式 求推荐SMC电磁阀或者其他合适的电磁阀求推荐合适的电磁阀:三位五通,3/8接口管径,中封式.公司有一机械手,因为气缸带动的部件有一定重量,普通电磁阀容易出现:1、半空停顿时气缸缓慢下 请介绍一本带图解的汽车构造与原理的书 武汉哪里有电动车电池修复店 汽车有几部分组成 我有一个气缸,我不加电磁阀直接接上气管,居然顶不动,然后我加上电磁阀就顶动了,这是为什么?气缸不就是一个进气一个出气就推,然后反过来就拉,我是一边直接加气管,另一边什么也不接,空 车辆转弯打方向盘有哪些技巧 为什么匀速运动的小汽车前面有牵引力? 物理:为了安全,在公路上行驶的汽车间应保持必要的距离.已知某高速公路的最高限速v=72km/h.假设前方车辆突然停止,后面司机从发现这一情况,经操作刹车,到汽车开始减速所经历的时间(即 小车左后转弯和右后转弯的方法 汽车都有哪些部分组成? 为了安全,在公路上行驶的汽车之间应保持必要的距离.已知某高速公路的最高限速为120Km/h,假设前方车辆突然停止,后车司机发现此情况后立即刹车,这中间的反应时间为0.5s,刹车时汽车受到的 车辆在高速公路意外撞击护栏的瞬间,应迅速向相反方将转向躲避这题答案是错误的可是快撞上了我还要朝着相同方向打方向盘吗?那不死的更快?这题没毛病吗? 日本SMC电磁阀 VT307-5G-02-F这个表示什么意思?类似的还有其他的举例能不能介绍下. 高一物理题--------------------------------为了安全,在公路上行驶的汽车之间应保持必要的距离,已知某高速公路的最高限速为120km/h,假设前方车辆突然停止,后车司机从发现这一情况,经操纵刹车,到 汽车上的阳光传感器是干什么用的……一共有几个……一般都装在什么部位……它的作用是什么.丰田的两个阳光传感器都装在哪里? 自动档汽车的前进D档有几个档位 一道物理题:为了安全,在公路上行驶的汽车间应保持必要的距离.已知某高速公路的最高限速v=120km/h,假设前车突然停止,后车司机发现这一情况,从发现情况到汽车开始制动减速所通过的位移 为什么汽油价格的提高使得汽车销售遭遇尴尬?人们为什么把眼光更多的投向小排量汽车和电动自行车? 汽车分几部分组成?分别是什么? 为了安全 在公路上行驶的汽车之间应保持必要的距离(高中物理)为了安全 在公路上行驶的汽车之间应保持必要的距离,已知某高速公路上行驶的汽车速度为v=108km/h.假设前方140m处车辆因故 汽油价格的提高使汽车销售下降,人们为什么把眼光更多的投向一新能源汽车和电动自行车! 关于可调行程气缸假如我有一个行程是200可调行程是50的气缸,那么这个气缸的实际应用的行程到底是多少?是0到200还是0到150还是150到200?气缸标注的行程跟可调行程之间的关系式什么? 汽车构造试题?1.某国产汽车的产品型号名称为:TJ7102B,该汽车按照标准规定,该车属于 . 2.四冲程汽油机每完成一个工作循环要经过进气行程、压缩行程、 、和 四个行 随着人们环保意识的增强,以汽油为燃料的助力车,因汽油价格等因素已逐步退出市场,而电动自行车正得以推广.汽油的热值为4×10^7J/kg,下表为某品牌电动车的性能参数表,最高车速6m/s 一次充电 SMC有伸缩式行程1.2米载重半吨气缸吗?价格和型号是多少? 汽车构造习题求解答试计算某四吨载重汽车以60公里/小时的速度等速直线行驶时的阻力及其所能克服的最大坡度(%)原始数据:汽车总重G=8000kg,发动机最大扭矩M=31kg.m.滚动阻力系数f=0.015,空 汽车上各个传感器的作用分别是什么? 小车前进中挂了倒档怎么办 1求简答汽环与油环作用!2为什么有的配汽机构中采用俩个套装的汽门弹簧3限压阀和旁通阀有什么作用4自冲泵汽油机工作过程5四冲泵汽油机工作过程6汽车驱动力如何产生7汽油机和柴油机的 立马电动车好不好?作为立马电动车的用户,非常的不满意.买车还没一个月,刹车就失灵了.碰到紧急状况,直接就撞上去了.保险杠撞扁.去维修处修理,说刹车不灵造成撞车要修理的物件,不关他们 如果汽车高速行驶,从前进档直接挂倒档会怎么样? 汽车上的电瓶可以安装电动车上吗?我家有好几个欧豹700上的电瓶 我想用一个安装电动车上可以吗 立马电动车大家都别买立马的啊 后悔啊 !亲身经历.买了没多久(也就一周左右 ),电瓶坏了,经销商一开始不给修,墨迹了半天才给修,一开始说的是68V 14安时的电瓶,修回来以后就成了10安时的 汽车由哪几部分组成 电动车电池怎样正确安装?自行车式的电动车电池是4块,竖着放置.请问行家怎样才是正确的安装方法?能不能倒着放置?(接线柱朝下) 滚动摩擦力的大小与什么有关?自行车车轮与地面之间的摩擦是滚动摩擦?当自行车轮胎瘪了时骑起来比较费力,是不是可以说滚动摩擦的大小与接触面面积有关?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn