**这是本文档旧的修订版!**
Windows XP下编译C++14/17程序手记
自己平时写程序不太讲究向前兼容性,有什么新的用什么,先爽了再说。
于是,当甲方提出他们想要在Windows XP上运行一个源码中使用了大量高版本boost/CGAL/std::thread/lambda的程序的时候,我就相当的思密达了……
关键词:mingw-64,boost,CGAL,libigl
以下为折腾要点与结论。所有的叙述都是在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.2,c++11/14/17兼容性上没有问题,可执行文件在XP上面也没有问题; Win-builds与Msys2版本,截至目前的最新版都已经不支持在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时,gmp和mpfr的问题很烦,即使用CGAL安装器也未必能成功下载预编译的库;可以手动下载之后手动解压到auxiliary/gmp目录;目前最新版的预编译库分别是gmp-all-CGAL-3.9和mpfr-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++17和Qt 5.9。手记如下:
Git,最后一个支持XP的版本: >TortoiseGit 1.8.16.0 (https://download.tortoisegit.org/tgit/1.8.16.0/) >Git 2.10.0 (https://github.com/git-for-windows/git/releases/tag/v2.10.0.windows.1)Python至少到2.7.6版本还能用;Ruby 1.9.3或更早版本兼容于XP,2.0以后的就需要自己想办法编译了。- 编译
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程序而已,这些模块跳过去可以节省空间,也降低了出错概率。 Qt 5.5以后用了一些XP下不支持的Win API,我遇到的第一个是SHGetKnownFolderPath,查看对比代码后,虽然直觉上感觉可以把Qt 5.5(官方最后一个支持XP的版本)的代码挪过来,但心里发怵,决定还是把我要编译的工程降级一下试试……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- 最终的
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 Qt 5.5的源代码占用约4G。static版本模式下,编译的临时文件加源码占用,安装后的文件占用不到3G。注意,install过程是复制文件,所以整个过程实际所需空间要乘二。愿诸君好自为之……install之后,Qt creator还需要单独安装。从源码来看,Qt Creator 4.1.0是最后一个可以在Qt 5.5下编译出来的版本。可以自己编译,也可以随便下载个5.5的官方包,安装时选择仅安装Qt creator就行了。- 然后在
Qt creator选项中Qt version项目下手动加入你安装的目录中的qmake.exe,后面的检测版本什么的会自动进行。然后设置好编译器什么的,就可以开始写程序了。 - 知道
static版本出来的文件大,没想打他有这么大:一个带空窗体的Hello world程序,Debug版本居然有351M,Release版也有15M. - 编译
libxml2:下载源码,进入win32子目录,按ReadMe和help操作。
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