wxWidgets+CodeBlocks Win平台搭建

来源:互联网 发布:互网络出版许可证 编辑:程序博客网 时间:2024/06/05 11:33
准备工作:
Win7 32位
wxMSW-3.0.1-Setup.exe (https://sourceforge.net/projects/wxwindows/files/3.0.0/wxMSW-3.0.0-Setup.exe/download)
codeblocks-16.01-setup.exe (https://nchc.dl.sourceforge.net/project/codeblocks/Binaries/16.01/Windows/codeblocks-16.01-setup.exe)
tdm-gcc-4.8.1-3.exe (https://nchc.dl.sourceforge.net/project/tdm-gcc/TDM-GCC%20Installer/Previous/1.1309.0/tdm-gcc-4.8.1-3.exe)



说明:
操作系统应该是没什么影响的,win7、win8,x86、x64应该都是可以的。
codeblocks的版本关系也不大,只是新的版本肯定功能更多,支持的东西也多些。
TDM-GCC的选择那就是见仁见智了,我选择它的原因就只有两个字“便捷”。
TDM-GCC和wxWidgets的版本的配搭是有讲究的,具体看wxWidgets官网的下载页面就知道了。
wxWidgets一个月前已经出到3.1.0了,不过太新的话配套的东西和相关的资料都会很少,所以新手的话还是选相对成熟一点的产品吧。
至于为什么不选wxWidgets3.0.2,那是因为它的BUG还是有点多啊。

 
步骤一:设置MinGW环境
执行“tdm-gcc-4.8.1-3.exe”安装包,一切按默认完成安装的话,它会被安装到“C:\TDM-GCC-32”。
此时我们运行cmd,执行“mingw32-make”语句出现下图提示的话就说明MinGW环境已经设置好了。


没错,就是这么简单,这是因为tdm-gcc在安装选项中已经默认勾选了添加环境变量,所以安装好后我们就可以直接拿来用了。
这也就是我选择和推荐tdm-gcc的原因。



 

 

步骤二:编译wxWidgets
执行“wxMSW-3.0.1-Setup.exe”安装包,一切按默认完成安装的话,它会被安装到“C:\wxWidgets-3.0.1”。
编辑“C:/wxWidgets-3.0.1/build/msw/config.gcc”

确定上面4个重要选项是对应的值,其它的不用管了。
下面来具体说说这4个值的内容:
SHARED:如果不想发布的EXE还要带上一个DLL的话,就将它狠狠地设为0吧。
UNICODE:现在的软件已经是UNICODE一统天下的局面了,这没什么好说的了。
release:关于release和debug大家都懂,至于这里为什么要用release。那是因为对新手而言,先接触的一般都是sample和demo,那就和debug暂时扯不上关系了,所以先让软件和文件简单一点吧。
MONOLITHIC:下面会有图文说明这一点,往下看就知道了。

执行编译命令

执行编译命令的时候可以去干点其它事情了,因为要等好久好久才能完成,大概有半个小时吧。
生成的库文件在 C:/wxWidgets-3.0.1/lib/gcc_lib,如下图左

右边是我修改参数后重新生成的库文件,此时我们回过头来理解一下 MONOLITHIC 参数的意义应该就会一目了然了。
这个参数的意义就是在执行文件的大小和附加库文件的便利性之间做一个取舍。
如果你知道自己创建的工程具体用到哪些库文件,那么你只引入那些用到的库,你发布的exe大小必定会小一些。但如果你分不清或者不想分清的话,那将MONOLITHIC设为1就会帮你省去很多工作。

 

步骤三:建立一个Sample项目来测试
经过前面两个步骤,前期的准备工作都做好了,此时我们可以通过CodeBlocks来建立自己的项目了。


上半部分是可以选择两个比较出名的布局GUI,通过可视化操作来布局我们的界面,但引入它们无疑会加大我们的学习量,所以暂时选择None吧。
下半部分是选择我们的应用程序时基于对话框还是框架的。


这里设置的是项目使用的全局变量,第一次运行的话肯定是没有设置过这个变量的,我们直接点击“Next”就会弹出编辑页面了,如下图:


这里要设置的其实就是打两个钩钩。
通常来说是两个都勾选上的,这样我们可以随时生成Debug或者Release版本。但因为我们前期准备工作只生成了Release的库文件,所以我们只能单选它了。


上半部分勾选的是要和我们先前编译的参数一致的,看名字应该可以看出要勾选什么了。
下半部分是一些比较“高级”的选项,暂时不勾选吧。


当我们点击下一步的时候我们的项目就建好了,此时我们按F9,编译并运行,如果我们能看到下面的界面时,那么恭喜你,你的第一个wxWidgets应用程序已经诞生了。

 

 

注:

 

在此过程中常见问题以及处理:

编译过程中出错:

error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options

 

编译(假设要编译一个Unicode共享库版的wxWidgets):

cd X:\wxWidgets-3.0.2\build\msw

    make -f makefile.gcc SHARED=1 UNICODE=1

  然而编译到一半,从C代码变为C++代码时,就会产生如下错误(有许多类似错误,只选取一处):

In file included from e:\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: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.

  既然只是c++11支持没有打开的问题,只要改一下CXXFLAGS即可,于是乎,按如下命令重新编译。

    make -f makefile.gcc CXXFLAGS="-std=c++11" SHARED=1 UNICODE=1 clean

    make -f makefile.gcc CXXFLAGS="-std=c++11" SHARED=1 UNICODE=1

  这次编译完了所有中间件,但是到链接时候又出了问题:

    E:\wxWidgets-3.0.2\lib\gcc_lib64/libwxmsw30ud.a(monolib_filename.o): In function `wxChmod(wxString const&, unsigned short)':
    E:\wxWidgets-3.0.2\build\msw/../../include/wx/filefn.h:513: undefined reference to `wxMSLU__wchmod(wchar_t const*, int)'
    E:\wxWidgets-3.0.2\lib\gcc_lib64/libwxmsw30ud.a(monolib_filename.o): In function `wxOpen(wxString const&, int, unsigned short)':
    E:\wxWidgets-3.0.2\build\msw/../../include/wx/filefn.h:515: undefined reference to `wxMSLU__wopen(wchar_t const*, int, int)'
    E:\wxWidgets-3.0.2\lib\gcc_lib64/libwxmsw30ud.a(monolib_file.o): In function `wxRemove(wxString const&)':
    E:\wxWidgets-3.0.2\build\msw/../../include/wx/wxcrt.h:758: undefined reference to `wxMSLU__wremove(wchar_t const*)'
    E:\wxWidgets-3.0.2\lib\gcc_lib64/libwxmsw30ud.a(monolib_file.o): In function `wxAccess(wxString const&, unsigned short)':
......

  这实在是令我百思不得其解了,翻遍了docs文件夹的每个角落,终于在install.txt中找到了答案,里面有这么一句话:

C++11 note: If you want to compile wxWidgets in C++11 mode, you currently have
            to use -std=gnu++11 switch as -std=c++11 disables some extensions
            that wxWidgets relies on. I.e. please use CXXFLAGS="-std=gnu++11".

  说的很清楚,不能用”std=c++11"进行编译,这会导致一些wxWidgets依赖的extensions(扩展名?)被屏蔽的问题。然后用以下命令重新编译,就成功了。

    make -f makefile.gcc CXXFLAGS="-std=gnu++11" SHARED=1 UNICODE=1 clean

    make -f makefile.gcc CXXFLAGS="-std=gnu++11" SHARED=1 UNICODE=1

 

原创粉丝点击