Windows XP下编译C++14/17程序手记

自己平时写程序不太讲究向前兼容性,有什么新的用什么,先爽了再说。

于是,当甲方提出他们想要在Windows XP上运行一个源码中使用了大量高版本boost/CGAL/std::thread/lambda的程序的时候,我就相当的思密达了……

关键词:mingw-64boostCGALlibigl

以下为折腾要点与结论。所有的叙述都是在Windows XP SP332位的大前提下讨论的。

  • CMake主程序至少到3.10.1都是可以运行在XP上的,但3.8.2之前才可以生成VC 2003 (vc编号7.1, msvc编号10.0)工程;
  • 但是不建议折腾VC 2003这条线,因为c++11特性无解;
  • 然而开始时我没想到这一点,还是折腾了,附加结论:兼容于VC 2003的最高boost版本是1.44.0
  • 接下来开始搞mingw,建议用mingw-w64(不要被名字迷惑,人家有32位版),截至目前(2018年01月18日)最新版搭配gcc 7.2c++11/14/17兼容性上没有问题,可执行文件在XP上面也没有问题;
  • Win-buildsMsys2版本,截至目前的最新版都已经不支持在XP下运行了,我也没兴趣研究老到什么版本可以运行;Cygwin虽然也有相对比较新的版本支持XP,但Cygwin库中的gcc版本才到5.4(2019年06月25日),所以不符合要求;
  • 安装mingw-w64时,线程库记得选POSIX,否则据说不支持std::thread
  • 装完mingw-w64的32位版本之后,需要将其下的bin目录加入Path,否则CMake不会自动找到它(这是小事),且运行起来会报找不到DLL的错误(这是大事);
  • mingw-w64下的make命令叫mingw32-make
  • 编译boost
> `bootstrap.bat gcc`
> `b2 ... toolset=gcc`,`...`处的命令跟其他平台一样
> 为啥写`gcc`呢?因为不写的话默认就用`msvc`了;同时,`Known toolsets are: acc, borland, cc, como, clang, darwin, gcc, gcc-nocygwin, intel-darwin, intel-linux, intel-win32, kcc, kylix, metrowerks, mipspro, msvc, qcc, pathscale, pgi, sun, sunpro, tru64cxx, vacpp, xlcpp, vc7, vc8, vc9, vc10, vc11, vc12, vc14, vc141, vmsdecc`,人家不认`mingw`这个东西,[某些教程](https://stackoverflow.com/questions/20265879/how-to-build-boost-1-55-with-mingw/)在这个问题上有错
  • Windows下编译CGAL时,gmpmpfr的问题很烦,即使用CGAL安装器也未必能成功下载预编译的库;可以手动下载之后手动解压到auxiliary/gmp目录;目前最新版的预编译库分别是gmp-all-CGAL-3.9mpfr-all-CGAL-3.9,解压后目录应该是这种结构:
C:\DOCUMENTS\DEV\LIB\CGAL-4.10.2\AUXILIARY
├─gdb
│  └─python
│  │   └─CGAL
└─gmp
│    ├─include
│    └─lib
|    |  └─ libgmp-10.dll
|    |  └─ libmprf-4.dll
|    |  └─ ……

如果是64位,自己把上面链接地址中的win32改成x64

  • gcc编译速度确实比msvc慢,但占用的磁盘空间也小多了;
  • 最终的boost编译命令:b2 install --prefix=C:\dev\lib\boost_1_65_1\install\mingw --build-dir=C:\dev\lib\boost_1_65_1\build toolset=gcc
  • 编译出来boost没问题,但CGAL只能编译成静态库,一旦选择BuildSharedLibrary选项,链接CGAL-Core的时候就出错,说找不到Boost里面一个跟线程相关的函数;到最后也没找到原因,先拿静态库凑合用了,反正目前为止没有报错;
  • libigl,在mingw-w64下有一个小bug:include/igl/writeOFF.cpp中由一个名叫RGB的变量跟某个名叫RGB的宏冲突,报错macro "RGB" requires 3 arguments, but only 2 given修正方法是把这个变量随便重命名一下……

2018年05月26日更新:

最近又有某个项目要做这个事情了,这次更夸张,要编译C++17Qt 5.9。手记如下:

  1. Python至少到2.7.6版本还能用;
  2. Qt源码:git下来的方式貌似挺先进,但是感觉缺文件还是怎么的,执行不下去,最后从官网这里下载了源码包。尤其诡异的是,git仓库里面有5.9.6这个分支,但这个链接中只有5.9.5.
  3. Ruby 1.9.3或更早版本兼容于XP,2.0以后的就需要自己想办法编译了。
  4. Qt 5.9configure.bat脚本有点问题,参见本博客“Windows批处理中SET对errorlevel的影响”一文
  5. 编译Qt时跳过的模块:-skip qtwebview -skip qtwebengine -skip qtactiveqt -skip qtandroidextras -skip qtcanvas3d -skip qtcharts -skip qtfeedback -skip qtgamepad -skip qtlocation -skip qtquick1 -skip qtquickcontrols -skip qtquickcontrols2 -skip qtsensors -skip qtserialbus -skip qtserialport -skip qtspeech -skip qtwebchannel——做个widget程序而已,这些模块跳过去可以节省空间,也降低了出错概率。
  6. Qt 5.5以后用了一些XP下不支持的Win API,我遇到的第一个是SHGetKnownFolderPath,查看对比代码后,虽然直觉上感觉可以把Qt 5.5(官方最后一个支持XP的版本)的代码挪过来,但心里发怵,决定还是把我要编译的工程降级一下试试……
  7. Qt 5.5少了一些模块,所以要跳过的模块改成了-skip qtwebkit -skip qtwebkit-examples -skip qtwebengine -skip qtactiveqt -skip qtandroidextras -skip qtcanvas3d -skip qtlocation -skip qtquick1 -skip qtquickcontrols -skip qtsensors -skip qtserialport -skip qtwebchannel
  8. 最终的configure命令:configure.bat -static -debug-and-release -confirm-license -opensource -opengl desktop -platform win32-g++ -prefix "C:\Documents\dev\lib\qt-builds\qt-5.5.1-mingw-7.2.0-posix-static" -qt-zlib -qt-pcre -qt-libpng -qt-libjpeg -qt-freetype -make libs -make tools -nomake examples -nomake tests -skip qtwebkit -skip qtwebkit-examples -skip qtwebengine -skip qtactiveqt -skip qtandroidextras -skip qtcanvas3d -skip qtlocation -skip qtquick1 -skip qtquickcontrols -skip qtsensors -skip qtserialport -skip qtwebchannel
  9. Qt 5.5的源代码占用约4G。static版本模式下,编译的临时文件加源码占用,安装后的文件占用不到3G。注意,install过程是复制文件,所以整个过程实际所需空间要乘二。愿诸君好自为之……
  10. install之后,Qt creator还需要单独安装。从源码来看,Qt Creator 4.1.0是最后一个可以在Qt 5.5下编译出来的版本。可以自己编译,也可以随便下载个5.5的官方包,安装时选择仅安装Qt creator就行了。
  11. 然后在Qt creator选项中Qt version项目下手动加入你安装的目录中的qmake.exe,后面的检测版本什么的会自动进行。然后设置好编译器什么的,就可以开始写程序了。
  12. 知道static版本出来的文件大,没想打他有这么大:一个带空窗体的Hello world程序,Debug版本居然有351M,Release版也有15M.
  13. 编译libxml2:下载源码,进入win32子目录,按ReadMehelp操作。

2019年06月25日更新: 安装打包程序Inno Setup应该是自6.0版本取消了对XP的支持。最新能用的5.5.9,官网旧版本处有下载。


2019年07月04日更新 今天编译glad库,但编译这玩意儿时非要从gayhub下载一个东西。但XP下的根证书可能已经与gayhub现在在用的证书对不上了。于是就反复的报url错误。

最终从这里找到了解决办法。这个网页上面的添加ctx参数的方法:

import urllib2
import ssl
 
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
 
urllib2.urlopen("https://your-test-server.local", context=ctx)

可能能用,但glad库中用的是urllib.request.open()函数,不接受context参数。最终使用了下面的方案,即:

You can just change default context: ssl._create_default_https_context = ssl._create_unverified_context and you don't need ctx at all.

2020年10月2日更新:

支持WinXP的最新的Qt Creator版本是qt-creator-opensource-windows-x86-3.4.2.exe

  • 最后更改: 2020/10/02 13:23