MinGW下使用STLPort5.2.1

本文介绍如何使用STLPort替代MinGW的标准模板库(STL)实现,以解决宽字符问题。通过编译静态或动态版本的STLPort库,并详细说明了编译和链接步骤,包括必要的命令行参数和库顺序。

用STLPort替代MinGW下的stl实现,解决MinGW的宽字符问题。

MinGW编译STLPort:

下载STLPort5.2.1,解压到本地目录,编译过程如下:
bash-3.1$ pwd
/z/STLport-5.2.1/build/lib
bash-3.1$ mingw32-make.exe -fgcc.mak clean release-static install
此命令编译static库
如果编译动态库使用命令
mingw32-make.exe -fgcc.mak clean release-shared install
但动态库目前用最新的gcc编译会出问题,用3.5的MinGW则可以顺利编译。
注意make需要使用MinGW所带的make,而不是msys的make,这点在STLPort文档中被强调过。

生成的so文件放到lib路径下,拷贝stlport文件夹作为STLPort的头文件文件夹。

 

使用STLPort库链接生成执行文件:

使用静态库:
E:\workspace\c++\project\STLPortTest>g++ -nodefaultlibs -mthreads -g -IE:\workspace\c++\STLPort5.2.1\stlport STLPortTest.cpp -LE:\workspace\c++\STLPort5.2.1\lib\so\ -lstlport -lsupc++ -lgcc_s -lgcc -lmingw32 -lmingwex -lmsvcrt -lm -lmoldname -lcoldname -lkernel32 -D_STLP_USE_STATIC_LIB

使用动态库:
E:\workspace\c++\project\STLPortTest>g++ -nodefaultlibs -mthreads -g -IE:\workspace\c++\STLPort5.2.1\stlport STLPortTest.cpp -LE:\workspace\c++\STLPort5.2.1\lib\so\ -lstlport.5.2.dll -lsupc++ -lgcc_s -lgcc -lmingw32 -lmingwex -lmsvcrt -lm -lmoldname -lcoldname -lkernel32

先编译生成obj,然后链接生成exe:

E:\workspace\c++\project\STLPortTest>g++ -c -mthreads -D_STLP_USE_STATIC_LIB -IE:\workspace\c++\STLPort5.2.1\stlport STLPortTest.cpp

E:\workspace\c++\project\STLPortTest>g++ -nodefaultlibs -o "STLPortTest.exe" STLPortTest.o -LE:\workspace\c++\STLPort5.2.1\lib\so\ -lstlport -lsupc++ -lgcc_s -lgcc -lmingw32 -lmingwex -lmsvcrt -lm -lmoldname -lcoldname -lkernel32

 

需要注意的地方:

  • -mthreads -D_STLP_USE_STATIC_LIB -IE:\workspace\c++\STLPort5.2.1\stlport 这些参数应该放在编译期,更准确说法应该是预处理阶段。
    -mthreads会改变导入的include文件内容,具体可以通过gcc -E查看预编译处理后的文件。
  • -nodefaultlibs必须放在链接期,并且对MinGW编译STLPort程序是必要的,阻止链接gcc提供的默认库。
  • 命令行中-I、代码文件顺序,各个库文件的顺序不能出错。.o文件顺序可以随意放,但是所依赖的库必须放在.o文件之后,且库和库的依赖顺序也必须确定,即A库所依赖的B库必须放在命令行中放在A库后面(右面)。
  • -lgcc是STLPort漏掉的参数,必须要。
  • -mthreads是必须要的参数,因为STLPort库编译时也是用多线程编译。
    加入-mthreads,则调用的文件预处理后,stl函数位于namespace stlp_std{},否则位于namespace stlpmtx_std {},因此若编译未加-mthreads,则链接STLPort库会报异常:
    STLPortTest.o:STLPortTest.cpp:(.text+0x19): undefined reference to `stlpmtx_std::cout'
    STLPortTest.o:STLPortTest.cpp:(.text$_ZN11stlpmtx_std8ios_base23_M_check_exception_maskEv[stlpmtx_std::ios_base::_M_check_exception_mask()]+
    0x1f): undefined reference to `stlpmtx_std::ios_base::_M_throw_failure()'。
  • 使用静态STLPort库时候需要-D_STLP_USE_STATIC_LIB定义_STLP_USE_STATIC_LIB宏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值