天天看点

boost-1.55.0和STLport-5.2.1的适配

编译环境:WIN8.1,VS2013专业版update3

一、编译boost本博客已有,参考列表,不再赘述。

二、STLport适配 (直接保存步骤二中修改后的源码即可)

下载stlport.   下载地址:http://sourceforge.net/projects/stlport/

解压到一个目录下面, 我的是解压到 G:\STLport_5_2_1

因为STLport并不完整支持C++11,所以需要修改一些STLport的源码,如下:

1. 将_cstdlib.h(158)代码修正为

#if !defined(_STLP_MSVC) || (_STLP_MSVC < 1600)

inline

_STLP_LONG_LONG

abs

(_STLP_LONG_LONG __x) {

return

__x < 0 ? -__x : __x; }

#endif

2. 将_cmath.h(497,498)的代码包裹一层宏处理

   #if !defined(_STLP_MSVC) || (_STLP_MSVC < 1800)    // 修改后的 _cmath.h line 497

   _STLP_MATH_INLINE2XX(float, hypot, hypot)     //修改前的 _cmath.h line 497 

   inline long double hypot(long double x, long double y) { return sqrt(x * x + y * y); }   //修改前的 _cmath.h line 498

   #endif  // 修改后的 _cmath.h line 500

3. 处理C++11的nullptr

编译时出现"'nullptr_t':is not a member of 'stlpd_std'"

当我们在用STLport联合编译boost时,编译过程会报出如上所示的错误,这个问题的原因在于,stlport不支持C++11标准中新增的nullptr_t和nullprt关键字,因此会出现这个错误,从网上查找到的解决办法是:

在X:\STLport-5.2.1\stlport\cstddef文件中增加下面一段代码即可,(笔者写在了文本作者注释后的最前面)

 #ifdef __cplusplus

 namespace std{typedef decltype(__nullptr)nullptr_t;}

 using  ::std::nullptr_t;

 #endif

4. 接着修改 "stlport\stl\type_traits.h" 文件,在  66 行附近找到下面的代码:

[cpp]  view plain copy

  1. #ifdef _STLP_USE_BOOST_SUPPORT  
  2. #  include <stl/boost_type_traits.h>  
  3. #  include <boost/type_traits/add_reference.hpp>  
  4. #  include <boost/type_traits/add_const.hpp>  
  5. #endif   

在 #endif 前加入如下一行代码:

[cpp]  view plain copy

  1. #  include <boost/type_traits/remove_const.hpp>  

5. boost支持STLport,因此我们在用这两个库联合编程时,在代码最前面加入宏开关

 #define _STLP_USE_BOOST_SUPPORT

加入后,比如我们就可以在STLport中使用更高效的boost::shared_ptr等高效组件。(#include <memeory>)

三、编译STLport

1. 打开vs2013的命令行工具, 在目录:C:\Program Files\Microsoft Visual Studio 12.0\Common7\Tools\Shortcuts\ 下面,   <VS2013 x86 本机工具命令提示> 即是, 双击运行.

2. 然后,启动 Visual Studio 2010 命令行方式,并定位到 STLport 主目录下,并按如下步骤执行命令(注意替换 %boostDir% 为具体的 Boost 路径):

[plain]  view plain copy

  1. configure msvc9 (--with-static-rtl 可选的,看下表) (--with-dynamic-rtl 可选的,看下表) (--use-boost %boostDir% 如果有boost可选)
  2. //之后 
  3. cd build\lib  
  4. nmake -f msvc.mak clean install 

--use-boost 指明 boost 库的路径。仅使用一下 boost 的几个头文件,所以无需事先编译 boost。

上面命令行的执行过程如下:

输入configure msvc9, 如下图:(STLport暂不支持MSVC10,11,12等高版本)

boost-1.55.0和STLport-5.2.1的适配

 再定位目录到 build/lib 下,  输入nmake -f msvc.mak clean install 。编译一会儿, 等个几分钟就编译完了.  看一下\STLport-5.2.1目录下面, 多了bin 和lib 两个目录. 里面有dll 和 lib.  将dll复制到VC\bin目录下面, 在项目中添加include,  lib目录即可使用stlport。

另外mark一下, 我是在win8.1 + vs2013环境下面使用的stlport, 它与C++ 11 的一些库有冲突. 使用C++11的新加一些像thread , 项目就会报错, stlport库就不能使用.  总而言之, 权衡一下吧.

最后(STLport部分编译参数)附表一张:

版本说明 生成的文件 编译说明 使用说明
使用动态运行史库的动态库版本

stlport.5.2.dll  stlport.5.2.lib

stlportd.5.2.dll stlportd.5.2.lib

stlportstld.5.2.dll stlportstld.5.2.lib

默认会生成 stlportstld.5.2.lib是调试模式版本,使用宏_STLP_DEBUG控制
使用静态运行时库的静态库版本

stlport_static.lib

stlportd_static.lib

stlportstld_static.lib

默认会生成 stlportstld_static.lib是调试版本,使用宏_STLP_DEBUG控制
使用静态运行时库的动态库版本

stlportstld_x.5.2.lib stlportstld_x.5.2.dll

stlportd_x.5.2.lib stlportd_x.5.2.dll

stlport_x.5.2.lib stlport_x.5.2.dll

配置时要

configure.bat msvc9  --with-static-rtl

要修改

stlport/stl/config/host.h

增加#define _STLP_USE_DYNAMIC_LIB

调试版本需要宏_STLP_DEBUG

使用动态运行时库的静态库版本

stlportstld_statix.lib

stlportd_statix.lib

stlport_statix.lib

配置时要

configure.bat  msvc9 --with-dynamic-rtl

要修改

stlport/stl/config/host.h

增加#define _STLP_USE_STATIC_LIB

调试版本需要宏_STLP_DEBUG

至此,boost和STLport的高效代码的美好时光就开始了,让我们抛弃VC自带的低效库吧。不过个人真心喜欢VS的文本编辑界面,哈,因此不舍得删。

继续阅读