Mingw64编译wxWidgets 3.0.2常见错误分析
使用Mingw64编译wxWidgets3.0.2,首先得下载wxMSW-Setup-3.0.2.exe(https://sourceforge.net/projects/wxwindows/files/3.0.2/wxMSW-Setup-3.0.2.exe,然后按照如下步骤编译(假设要编译一个Unicode共享库版的wxWidgets):
cdX:\wxWidgets-3.0.2\build\msw
make-fmakefile.gccSHARED=1UNICODE=1
然而编译到一半,从C代码变为C++代码时,就会产生如下错误(有许多类似错误,只选取一处):
Infileincludedfrome:\mingwd\mingw\include\c++\5.2.0\type_traits:35:0,
from..\..\include/wx/strvararg.h:25,
from..\..\include/wx/string.h:46,
from..\..\include/wx/any.h:19,
from../../src/common/any.cpp:18:
e:\mingwd\mingw\include\c++\5.2.0\bits\c++0x_warning.h:32:2:error:#errorThisfilerequirescompilerandlibrarysupportfortheISOC++2011standard.Thissupportiscurrentlyexperimental,andmustbeenabledwiththe-std=c++11or-std=gnu++11compileroptions.
既然只是c++11支持没有打开的问题,只要改一下CXXFLAGS即可,于是乎,按如下命令重新编译。
make-fmakefile.gccCXXFLAGS="-std=c++11"SHARED=1UNICODE=1clean
make-fmakefile.gccCXXFLAGS="-std=c++11"SHARED=1UNICODE=1
这次编译完了所有中间件,但是到链接时候又出了问题:
E:\wxWidgets-3.0.2\lib\gcc_lib64/libwxmsw30ud.a(monolib_filename.o):Infunction`wxChmod(wxStringconst&,unsignedshort)':
E:\wxWidgets-3.0.2\build\msw/../../include/wx/filefn.h:513:undefinedreferenceto`wxMSLU__wchmod(wchar_tconst*,int)'
E:\wxWidgets-3.0.2\lib\gcc_lib64/libwxmsw30ud.a(monolib_filename.o):Infunction`wxOpen(wxStringconst&,int,unsignedshort)':
E:\wxWidgets-3.0.2\build\msw/../../include/wx/filefn.h:515:undefinedreferenceto`wxMSLU__wopen(wchar_tconst*,int,int)'
E:\wxWidgets-3.0.2\lib\gcc_lib64/libwxmsw30ud.a(monolib_file.o):Infunction`wxRemove(wxStringconst&)':
E:\wxWidgets-3.0.2\build\msw/../../include/wx/wxcrt.h:758:undefinedreferenceto`wxMSLU__wremove(wchar_tconst*)'
E:\wxWidgets-3.0.2\lib\gcc_lib64/libwxmsw30ud.a(monolib_file.o):Infunction`wxAccess(wxStringconst&,unsignedshort)':
......
这实在是令我百思不得其解了,翻遍了docs文件夹的每个角落,终于在install.txt中找到了答案,里面有这么一句话:
C++11note:IfyouwanttocompilewxWidgetsinC++11mode,youcurrentlyhave
touse-std=gnu++11switchas-std=c++11disablessomeextensions
thatwxWidgetsrelieson.I.e.pleaseuseCXXFLAGS="-std=gnu++11".
说的很清楚,不能用”std=c++11"进行编译,这会导致一些wxWidgets依赖的extensions(扩展名?)被屏蔽的问题。然后用以下命令重新编译,就成功了。
make-fmakefile.gccCXXFLAGS="-std=gnu++11"SHARED=1UNICODE=1clean
make-fmakefile.gccCXXFLAGS="-std=gnu++11"SHARED=1UNICODE=1
后记
上面说到关于extensions,这里的意思应该是扩展,即gnu的g++(gcc)提供给c/c++代码除c++标准以外的支持。如果这些支持没有被启用,自然会导致上面像wxWidgets的库编译失败,不过这么依赖语言外的额外实现也不见得是件好事吧。