simplegui/Documents/How to build wxWidgets3.1.2 with MinGW in windows.md

114 lines
16 KiB
Markdown
Raw Normal View History

SimpleGUI为了方便开发者进行开发或预开发作业特设计了PC端模拟环境用以辅助开发模拟环境使用Codeblocks构建图形界面基于wxWidgets建立。。
2018年12月10日wxWidgets更新了3.1.2版本我也下载了最新的源码包准备重新编译更新一下wxWidgets库但在这个过程中遇到了一些问题解决后整理出来与诸位共享。
在这次版本更新之前根据Readme和百度必应查来的一些资料wxWidgets的编译命令如下。
`mingw32-make -f makefile.gcc MONOLITHIC=0 SHARED=0 UNICODE=1 BUILD=release CXXFLAGS="-fno-keep-inline-dllexport -std=gnu++11" `
这是按照我个人的使用习惯的编译命令,选项为:
`MONOLITHIC=0使用分立库`
`SHARED=0使用静态库`
`UNICODE=1使用Unicode编码`
这个命令我保存在一个.cmd文件里使用很久了从3.0.3就开始一直用到3.1.1版本。但是3.1.2的时候,出现问题了。
在这之前,有必要介绍一下我的系统环境,因为这个可能影响到这个问题发生的现象和结果。
出现问题的系统环境如下:
`OSWindows7 Professional SP1`
`编译器TDM-GCC 32Bit`
按照之前版本一样的操作先解压缩wxWidgets启动Windows的CMD进入到wxWidgets的build目录然后执行前文说过的编译命令。通常情况下单线程编译一次大概需要30分钟左右。
但是这次,我没有等来编译完成的提示,而是得到了一条错误:
`ar rcu ..\..\lib\gcc_lib\libwxmsw31u_core.a gcc_mswu\corelib_dummy.o gcc_mswu\corelib_event.o gcc_mswu\corelib_fs_mem.o gcc_mswu\corelib_msgout.o gcc_mswu\corelib_utilscmn.o gcc_mswu\corelib_main.o gcc_mswu\corelib_volume.o gcc_mswu\corelib_activex.o gcc_mswu\corelib_app.o gcc_mswu\corelib_bitmap.o gcc_mswu\corelib_brush.o gcc_mswu\corelib_caret.o gcc_mswu\corelib_clipbrd.o gcc_mswu\corelib_colour.o gcc_mswu\corelib_cursor.o gcc_mswu\corelib_data.o gcc_mswu\corelib_dc.o gcc_mswu\corelib_dcclient.o gcc_mswu\corelib_dcmemory.o gcc_mswu\corelib_dcprint.o gcc_mswu\corelib_dcscreen.o gcc_mswu\corelib_dialup.o gcc_mswu\corelib_dib.o gcc_mswu\corelib_display.o gcc_mswu\corelib_enhmeta.o gcc_mswu\corelib_font.o gcc_mswu\corelib_fontenum.o gcc_mswu\corelib_fontutil.o gcc_mswu\corelib_gdiimage.o gcc_mswu\corelib_gdiobj.o gcc_mswu\corelib_gdiplus.o gcc_mswu\corelib_graphics.o gcc_mswu\corelib_icon.o gcc_mswu\corelib_imaglist.o gcc_mswu\corelib_minifram.o gcc_mswu\corelib_nonownedwnd.o gcc_mswu\corelib_comimpl.o gcc_mswu\corelib_dataobj.o gcc_mswu\corelib_dropsrc.o gcc_mswu\corelib_droptgt.o gcc_mswu\corelib_oleutils.o gcc_mswu\corelib_safearray.o gcc_mswu\corelib_palette.o gcc_mswu\corelib_pen.o gcc_mswu\corelib_popupwin.o gcc_mswu\corelib_printdlg.o gcc_mswu\corelib_printwin.o gcc_mswu\corelib_region.o gcc_mswu\corelib_renderer.o gcc_mswu\corelib_settings.o gcc_mswu\corelib_textmeasure.o gcc_mswu\corelib_tooltip.o gcc_mswu\corelib_toplevel.o gcc_mswu\corelib_uiaction.o gcc_mswu\corelib_utilsgui.o gcc_mswu\corelib_utilswin.o gcc_mswu\corelib_uxtheme.o gcc_mswu\corelib_window.o gcc_mswu\corelib_graphicsd2d.o gcc_mswu\corelib_utilsrt.o gcc_mswu\corelib_taskbarcmn.o gcc_mswu\corelib_helpchm.o gcc_mswu\corelib_taskbar.o gcc_mswu\corelib_helpwin.o gcc_mswu\corelib_joystick.o gcc_mswu\corelib_aboutdlg.o gcc_mswu\corelib_notifmsg.o gcc_mswu\corelib_richtooltip.o gcc_mswu\corelib_sound.o gcc_mswu\corelib_automtn.o gcc_mswu\corelib_notifmsgrt.o gcc_mswu\corelib_uuid.o gcc_mswu\corelib_evtloop.o gcc_mswu\corelib_clrpickerg.o gcc_mswu\corelib_collpaneg.o gcc_mswu\corelib_filepickerg.o gcc_mswu\corelib_fontpickerg.o gcc_mswu\corelib_generic_statusbr.o gcc_mswu\corelib_prntdlgg.o gcc_mswu\corelib_msw_accel.o gcc_mswu\corelib_msw_anybutton.o gcc_mswu\corelib_appprogress.o gcc_mswu\corelib_artmsw.o gcc_mswu\corelib_msw_bmpbuttn.o gcc_mswu\corelib_msw_button.o gcc_mswu\corelib_msw_checkbox.o gcc_mswu\corelib_msw_choice.o gcc_mswu\corelib_colordlg.o gcc_mswu\corelib_combo.o gcc_mswu\corelib_msw_combobox.o gcc_mswu\corelib_msw_control.o gcc_mswu\corelib_msw_dialog.o gcc_mswu\corelib_dirdlg.o gcc_mswu\corelib_dragimag.o gcc_mswu\corelib_filedlg.o gcc_mswu\corelib_frame.o gcc_mswu\corelib_msw_gauge.o gcc_mswu\corelib_headerctrl.o gcc_mswu\corelib_iniconf.o gcc_mswu\corelib_msw_listbox.o gcc_mswu\corelib_msw_listctrl.o gcc_mswu\corelib_mdi.o gcc_mswu\corelib_msw_menu.o gcc_mswu\corelib_menuitem.o gcc_mswu\corelib_metafile.o gcc_mswu\corelib_msgdlg.o gcc_mswu\corelib_nativdlg.o gcc_mswu\corelib_nativewin.o gcc_mswu\corelib_msw_notebook.o gcc_mswu\corelib_access.o gcc_mswu\corelib_ownerdrw.o gcc_mswu\corelib_progdlg.o gcc_mswu\corelib_msw_radiobox.o gcc_mswu\corelib_msw_radiobut.o gcc_mswu\corelib_richmsgdlg.o gcc_mswu\corelib_msw_scrolbar.o gcc_mswu\corelib_msw_slider.o gcc_mswu\corelib_msw_spinbutt.o gcc_mswu\corelib_spinctrl.o gcc_mswu\corelib_msw_statbmp.o gcc_mswu\corelib_msw_statbox.o gcc_mswu\corelib_statusbar.o gcc_mswu\corelib_msw_statline.o gcc_mswu\corelib_msw_stattext.o gcc_mswu\corelib_taskbarbutton.o gcc_mswu\corelib_msw_toolbar.o gcc_mswu\corelib_msw_textctrl.o gcc_mswu\corelib_textentry.o gcc_mswu\corelib_msw_tglbtn.o gcc_mswu\corelib_treectrl.o gcc_mswu\corelib_systhemectrl.o gcc_mswu\corelib_customdraw.o gcc_mswu\corelib_animateg.o gcc_mswu\corelib_commandlinkbutton.o gcc_mswu\corelib_bmpcbox.o gcc_mswu\corelib_hyperlink.o gcc_mswu\corelib_calctrl.o gcc_mswu\corelib_datectrl.o gcc_mswu\corelib_datetimectrl.o gcc_mswu\corelib_timectrl.o gcc_mswu\corelib_datecontrols.o gcc_mswu\corelib_activityindicator.o gcc_mswu\corelib_msw_checklst.o
`makefile.gcc:5358: recipe for target '..\..\lib\gcc_lib\libwxmsw31u_core.a' failed`
`ar: gcc_mswu\corelib_makuptext.o: No such file or directory`
`mingw32-make: *** [..\..\lib\gcc_lib\libwxmsw31u_core.a] Error 1`
错误很简单但是也很奇怪错误提示是找不到“gcc_mswu\corelib_makuptext.o”文件应该是目录或者文件名不对奇怪也奇怪在这个文件不论是编译的.o文件还是Makefile中的记录都找不到一个名字为corelib_makuptext的文件唯一比较相近的就是markuptext.cpp和corelib_markuptext.o这种文件名缺个字母的事儿我还真的第一次遇到。
我寻思在网上找一下,看有没有人遇到过类似的错误,但是很遗憾,没找到……
不过也算是有了意外收获因为在一篇发布于2015年的博客里提到了一个错误是因为命令行太长博客的地址如下有兴趣的可自行阅读或参考[MinGW编译wxWidgets中的问题及解决方法](https://www.cnblogs.com/tr0217/p/4804943.html)
上网查一下控制台命令参数的最大程度为8192排除掉结尾字符也就是8191字回过头再看看控制台回显这个命令行确实不短复制出来一看总长度9834……
我觉得我可能找到问题了再重新定位一下第8191个字符刚好在corelib_markuptext.o文件名中。
我将上面的一长串命令单独执行一下,发生了同样的错误!
知道了问题的可能所在,就该着手解决了,我写了一个简单的测试用.cmd文件将上面的一长串命令拆解为两个命令
`ar rcu [一部分.o文件]`
`ar ru [另一部分.o文件]`
至于为什么第一句的参数是rcu第二句是ru请自行查询ar的参数含义。
然后执行这个.cmd文件编译成功了libwxmsw31u_core.a被正确生成了
至此已经能明确知道这个错误就是因为命令参数过长导致的至于GCC的ar命令是如何读取参数字符串的我没有仔细考证但解决方法就是将命令拆开使用。
针对此问题分析Makefile如下
此错误发生在编译libwxmsw31u_core.a时此编译对象被分为两个部分一部分为“CORELIB_OBJECTS”自身的.o文件共7个。另外还包含”____CORE_SRC_FILENAMES_3_OBJECTS“编译对象视WXUNIV使能控制为338个或322个。
而静态库文件在编译时,直接使用了以下命令:
`ar rcu $@ $(CORELIB_OBJECTS)`
导致命令行超长,编译失败。
所以针对此问题makefile的修改如下
1、新建“CORE_BUILD_OBJ_PART_0”定义包含“CORELIB_OBJECTS”中“CORE_SRC_FILENAMES_3_OBJECTS”以外的所有内容。
``CORE_BUILD_OBJ_PART_0 = \`
`$(OBJS)\corelib_dummy.o \`
`$(OBJS)\corelib_event.o \`
`$(OBJS)\corelib_fs_mem.o \`
`$(OBJS)\corelib_msgout.o \`
`$(OBJS)\corelib_utilscmn.o \`
`$(OBJS)\corelib_main.o \`
`$(OBJS)\corelib_volume.o``
2、新建"CORE_SRC_FILENAMES_3_OBJECTS_PART_0"和"CORE_SRC_FILENAMES_3_OBJECTS_PART_1"将原有“CORE_SRC_FILENAMES_3_OBJECTS”变量中的文件分别包含大概五五开的样子就可以。
3、清空“CORE_SRC_FILENAMES_3_OBJECTS”变量中的内容包含刚才新建的"CORE_SRC_FILENAMES_3_OBJECTS_PART_0"和"CORE_SRC_FILENAMES_3_OBJECTS_PART_1"两个变量。
`____CORE_SRC_FILENAMES_3_OBJECTS = \`
`$(CORE_SRC_FILENAMES_3_OBJECTS_PART_0) \`
`$(CORE_SRC_FILENAMES_3_OBJECTS_PART_1)`
4、清空“CORELIB_OBJECTS”中的内容包含前文新建的“CORE_BUILD_OBJ_PART_0”、"CORE_SRC_FILENAMES_3_OBJECTS_PART_0"和"CORE_SRC_FILENAMES_3_OBJECTS_PART_1"三个变量。
`CORELIB_OBJECTS = \`
`$(CORE_BUILD_OBJ_PART_0) \`
`$(CORE_SRC_FILENAMES_3_OBJECTS_PART_0) \`
`$(CORE_SRC_FILENAMES_3_OBJECTS_PART_1)`
5、修改编译命令为
`ar rcu $@ $(CORE_BUILD_OBJ_PART_0)`
`ar ru $@ $(CORE_SRC_FILENAMES_3_OBJECTS_PART_0)`
`ar ru $@ $(CORE_SRC_FILENAMES_3_OBJECTS_PART_1)`
完成如上操作后,重新编译,编译动作顺利完成。
另外如果编译的命令参数MONOLITHIC为1的时候在编译最终的链接库时候也会因为命令行过长出现类似问题由于使用的编译模式不同目前只能用“gcc_mswudll\monodll\*.o”替代“$(MONODLL_OBJECTS)”临时解决暂时还没想到更好的办法修改Makefile的话修改量可能会很大。其实帖子开头的问题也可以用类似的办法搞定把“$(CORELIB_OBJECTS)”替换为“gcc_mswu\corelib\*.o”就好而且我也确认过makefile的内容这样改没有问题但是还是会担心漏掉什么所以才有了上文的该法。
虽然问题解决了但是我还有个问题像这种维护了很长时间而且比较有影响力的开源项目不会这么不负责任把有问题的环境放上来那么他们是怎么编译过的呢而且官网也有编译好的二进制文件放出不应该有问题。Windows的命令行参数长度固定为8192超过这个值一定会出问题那么一定是他们的发布并不是在Windows上验证的很有可能是在Linux上用Mingw编译。
于是我把我装有Ubuntu Core开发板上电点亮控制台上输入如下命令
`getconf ARG_MAX`
然后我看到了一个丧病的数字:
`2097152`
好吧,真相就是这样了,如果大大们有更好的解决方案,烦请告知。