Windows XP下编译C++14/17程序手记
自己平时写程序不太讲究向前兼容性,有什么新的用什么,先爽了再说。
于是,当甲方提出他们想要在Windows XP
上运行一个源码中使用了大量高版本boost
/CGAL
/std::thread
/lambda
的程序的时候,我就相当的思密达了……
关键词:mingw-64
,boost
,CGAL
,libigl
以下为折腾要点与结论。所有的叙述都是在Windows XP SP3
32位的大前提下讨论的。
- 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