vs配置PCL无法打开BOOST源文件怎么办

vs配置PCL无法打开BOOST源文件怎么办,第1张

1,穗枯前到官网下载最新的boost,这里我下载的1-63版本.

2,安装,解压后运行bootstrap.bat文件。稍等一小会就OK。

3,编译boost库。注意一定要使用VS2015的x86本猜清机工具命令提示,这个可以在VS2015的安装菜单里面找到。进入命令行提示,输入下面的内容:

bjam -j4 --debug-symbols=on --build-type=complete toolset=msvc-14.0 threading=multi runtime-link=shared address-model=32

注意这里指定的运行库类型是动态链接库:

runtime-link=shared

当然也可以选择静态库,这样指定即可:

runtime-link=static

根据电脑配置,太低可能要30分钟败握到一小时。然后等待编译完毕。

下载Boost库,这里我选择下载boost_1_55_0.zip

解压boost文件到本地目录(如G:\boost_1_55_0),可以发现解压后的文件中有一个bootstrap.bat文件。

然后以管理员身份打开cmd窗口岩唤,

上述命令执行完毕后可以发现G:\boost_1_55_0下新生成了一个bjam.exe文件

在命令窗口中输入语句:bjam.exe

此过程将默认根据系统已经安装好的编译工具(VS2008,2010,2012,2013)等编译相应的Lib文件、头文件等。(此步骤大概需要圆简10分钟)

可以看到msvc 12.0,这是因为我系统中已经安装过了VS2013

msvc : 8.0是VS2005

msvc : 10.0是VS2010

msvc : 12.0是VS2012、VS2013

第5步执行成功后会有如下信息提示

至此我们已经完成了boost库的安装,下面需要配置一下VS2013了。新建一个VS2013控制台应用程序(工程名为boostest),添加如下代码

#include "stdafx.h"

#include <boost/lexical_cast.hpp>

#include <iostream>

using namespace std

int main()

{

using boost::lexical_cast

int a = lexical_cast<int>("123")

double b = lexical_cast<double>("123.0123456789")

string s0 = lexical_cast<string>(a)

string s1 = lexical_cast<string>(b)

cout <<"number: " <<a <<" " <<b <<endl

cout <<"string: " <<s0 <<" " <<s1 <<endl

int c = 0

try{

c = lexical_cast<橘枣裤int>("abcd")

}

catch (boost::bad_lexical_cast&e){

cout <<e.what() <<endl

}

return 0

}

添加boostest工程的包含目录和库目录

包含目录添加 G:\boost_1_55_0

库目录添加G:\boost_1_55_0\stage\lib

进入代码窗口编译并成功运行说明BOOST库确实已经配置成功,可以放心使用。

下载了boost包之后,运行其根目录下的bootstrap.bat生成bjam.exe文件,bjam.exe是生成boost库的.lib文件的工具

然后在命令行输入

bjam stage --toolset=msvc-10.0 --stagedir="D:/U3D Demo/AsioTestServer/boost_1_45_0" link=shared runtime-link=shared threading=multi debug release

bjam stage --toolset=msvc-10.0 --stagedir="帆做D:/U3D Demo/AsioTestServer/boost_1_45_0" link=static runtime-link=static threading=multi debug release

上一句是生成动态库,下一句是生成静态库

编译时间比较长,编译完成以后,目录中会多一个lib目录,里面就是库文件了

回到VS2010一编译,报错之!错误 1 error LNK1104: 无法打开文件“libboost_system-vc100-mt-gd-1_45.lib” ......

查找之,使用boost库不需要在工程设置中显式的指定库名字,而是由boost自身来完成这个设定的。由于boost库跨平台并且支持多个编译环境,因此这个被链接库文件的文件名是根据当前编译的配置动态生成的。boost_system是库的基本名称,vc100是编译环境,mt表示这是一个迹轿敬多线程库,gd表示包含调试信息,最后的1_45是版本号。检查lib目录的库文件,发现有boost_system-vc100-mt-gd-1_45.lib,所以很明显,在库名生成的过程中出现了问题,多了一个“lib”前缀。

打开boost/regex.hpp,继续打开boost/regex/config.hpp文件,最终可以发现动态链接配置的功能是由boost/config/auto_link.hpp统一实现的。在这个文件开头的注释里详细说明了使用方式。这里提到了名称的构造公式:

BOOST_LIB_PREFIX

+ BOOST_LIB_NAME

+ "_"

+ BOOST_LIB_TOOLSET

+ BOOST_LIB_THREAD_OPT

+ BOOST_LIB_RT_OPT

"-"

+ BOOST_LIB_VERSION

根据我们的错误,我们应该检查BOOST_LIB_PREFIX的值为什么是“lib”而不是空的。通过搜索,发现

[cpp] view plaincopyprint?

#if (defined(_DLL) || defined(_RTLDLL)) &&defined(BOOST_DYN_LINK)

# define BOOST_LIB_PREFIX

#elif defined(BOOST_DYN_LINK)

# error "Mixing a dll boost library with a static runtime is a really bad idea..."

#else

# define BOOST_LIB_PREFIX "lib"

#endif

[cpp] view plaincopyprint?

#if (defined(_DLL) || defined(_RTLDLL)) &&defined(BOOST_DYN_LINK)

# define BOOST_LIB_PREFIX

#elif defined(BOOST_DYN_LINK)

# error "Mixing a dll boost library with a static runtime is a really bad idea..."

#else

# define BOOST_LIB_PREFIX "lib"

#endif

现在终于清楚了,我们应该在工程设置中加入_DLL定义或者_RTLDLL定义,并且指定boost库采用动态姿慎连接(定义BOOST_DYN_LINK)。

在工程设置中加入_DLLBOOST_DYN_LINK,链接通过。 但又报另一个库链接错误,错误原因相同,查看auto_link.hpp文件末尾,发现

#if defined(BOOST_DYN_LINK)

# undef BOOST_DYN_LINK

#endif

这样,刚定义的BOOST_DYN_LINK在用过一次之后就失效了,所以注释这一段,之后编译就没问题了。分析要么在工程中添加BOOST_DYN_LINK,然后注释undef这段代码,要么把BOOST_DYN_LINK定义在auto_link.hpp的开头。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/12295534.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存