编译环境: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 行附近找到下面的代码:
- #ifdef _STLP_USE_BOOST_SUPPORT
- # include <stl/boost_type_traits.h>
- # include <boost/type_traits/add_reference.hpp>
- # include <boost/type_traits/add_const.hpp>
- #endif /* _STLP_USE_BOOST_SUPPORT */
- # 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 路径):
- configure msvc9 (--with-static-rtl 可选的,看下表) (--with-dynamic-rtl 可选的,看下表) (--use-boost %boostDir% 如果有boost可选)
- //之后
- cd build\lib
- nmake -f msvc.mak clean install
--use-boost 指明 boost 库的路径。仅使用一下 boost 的几个头文件,所以无需事先编译 boost。
上面命令行的执行过程如下:
输入configure msvc9, 如下图:(STLport暂不支持MSVC10,11,12等高版本)
再定位目录到 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的文本编辑界面,哈,因此不舍得删。