MinGW下使用STLPort5.2.1

用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宏。

你可能感兴趣的:(ios,C++,c,IE,C#)