本文基于 CodeBlocks (16.01) 和 wxWidgets (3.0.2) 搭建 Windows 环境下 GUI 开发环境。
1. CodeBlocks 官网,下载最新版安装包 codeblocks-16.01mingw-setup.exe
此版本包含GCC,GDB,官网介绍为: NOTE: The codeblocks-16.01mingw-setup.exe file includes additionally the GCC/G++ compiler and GDB debugger from TDM-GCC (version 4.9.2, 32 bit, SJLJ).
我的安装目录: C:\Program Files (x86)\CodeBlocks, 后续编译要用到 CodeBlocks 内含的编译器,故将 C:\Program Files (x86)\CodeBlocks\MinGW\bin 添加到环境变量 Path。
2. wxWidgets 官网,下载源码包,各文档介绍如下图,
3. 解压缩 wxMSW-3.0.2.7z 到 C:\wxMSW-3.0.2, 在该目录下,新建 bat 文件 wxBuild_ver.0.1.bat, 内容如下,
@echo off
cd build/msw
title Compile wxWidgets
echo Start Compile ...
echo ---------------------------------------------------------------------
::echo Clean Env
::mingw32-make -f makefile.gcc clean
echo Compile Release Version
:: SHARED=0, Static Link Library. SHARED=1, Dynamic Link Library.
:: MONOLITHIC=0, Multiple Widgets. MONOLITHIC=1, Single Widgets.
:: UNICODE=0, Not Support Unicode. Unicode=1, Support Unicode.
mingw32-make -f makefile.gcc BUILD=release SHARED=0 MONOLITHIC=0 UNICODE=1
echo Compile Debug Version
mingw32-make -f makefile.gcc BUILD=debug SHARED=0 MONOLITHIC=0 UNICODE=1
echo ---------------------------------------------------------------------
echo Compile Succeed.
pause
执行该文件,即可完成编译。 (各编译选项的详细解释,见本文最后的附录)
注意:
对于 wxWidgets 3.0.2 + CodeBlocks 16.02 (GCC 4.9.2) 的编译,在编译过程中遇到 C++ 2011 的兼容性问题, wxWidgets 官方给的解决方案在这里。
4. CodeBlocks 环境设置
打开 CodeBlocks, Settings -> Global variables... , 添加 wx 变量和路径如下图,
5. wx GUI 工程 demo
默认工程的运行结果如下,
至此,环境搭好了。
6. 最后的问题。
基于 MinGW-GCC 编译的程序,要依赖相关的 .dll 库运行,所以,把生成的 exe 文件拷贝到其它电脑,将出现以下错误,
解决方法,右键点击工程,选择 Build options,
分别将 Debug 和 Release 的 Linker settings 标签下的 Other Linker options 下添加 -static 链接选项。
重新编译工程。这样生成的 exe 即可脱离开发环境运行。
附录. 各编译选项的解释
BUILD 控制 wxWidgets 构建调试版本 (BUILD=debug)或者是发布版本(BUILD=release)。
- debug 构建 wxWidgets 会创建带有 ”d” 后缀的库,例如 ”libwxmsw28d.a”、”wxmsw28d_gcc_custom.dll”。
- debug 构建 wxWidgets 会在 wxWidgets 库的输出目录中创建 ”mswd” 或者 “mswud” 目录。
- release 构建 wxWidgets 创建的库没有 ”d” 后缀,例如 ”libwxmsw28.a”、”wxmsw28_gcc_custom.dll”。
- release 构建 wxWidgets 会在 wxWidgets 库的输出目录中创建 ”msw” 或者 “mswu” 目录。
SHARED 控制 wxWidgets 是构建 DLL(SHARED=1) 还是静态库 (SHARED=0)。利用构建的 DLL,主程序构建时间较快,可执行文件更小。但是可执行文件加上 wxWidgets DLL 的总大小更大,但是不同的可执行文件可以使用同一个DLL。
- wxWidgets 的 DLL 构建会创建导入库(如 libwxmsw28.a)以及 DLL 文件(如 wxmsw28_gcc_custom.dll)。你必须在发布你的程序的时候包含这个DLL。
- wxWidgets 的静态构建只会创建静态库(如 libwxmsw28.a),发布的时候也无须包含 wxWidgets 的DLL。
MONOLITHIC 控制是构建一个单一的库 (MONOLITHIC=1)还是多个组件库(MONOLITHIC=0)。使用单一构建,项目的设置和开发会更加简单,如果你同时使用 DLL 构建的话, 你只需要分发一个 DLL 文件。如果使用非单一构建(multilib),会构建出多个不同的库同时你可以避免将整个 wxWidgets 的基本代码链接到主程序,就可以去掉不需要的库。同时你也必须确保你选择了正确的组件库 (建立工程的时候有个库组件选项)。
- wxWidgets 的单一构建仅会创建一个 wxWidgets 导入库(如 libwxmsw28.a)以及一个 DLL(如 wxmsw28_gcc_custom.dll)。
- wxWidgets 的多库(multilib)构建会创建多个导入库(libwx28_base.a等)以及多个 DLL 文件。
- 无论何种 wxWidgets 构建,都会创建额外的静态库(如 libwxexpat.a、libwxjpeg.a 等)。这些库对于 wxWidgets 的 DLL 构建一般是不需要的,但是当使用静态构建的时候,则是必须的。
UNICODE 控制 wxWidgets 以及你的程序是否使用支持 Unicode 的宽字符串。大多数 Windows 2000 或更高系统上的应用程序都应该支持 Unicode。早期的Windows 版本不一定有 Unicode 支持。你应该总是使用 wxWidgets 的 _("string") 和 _T("string") 宏来确保硬编码的字符串编译时是正确的类型。
- wxWidgets 的 Unicode(UNICODE=1)构建将会创建带有 ”u” 后缀的库,例如 ”libwxmsw28u.a”、”wxmsw28u_gcc_custom.dll”。
- wxWidgets 的 Unicode 构建会在 wxWidgets 库的输出目录中创建 ”mswu” 或 ”mswud” 目录。
- wxWidgets 的 ANSI(UNICODE=0) 构建创建的库没有 ”u” 后缀,例如 ”libwxmsw28.a”、”wxmsw28_gcc_custom.dll”。
- wxWidgets 的 ANSI 构建会在 wxWidgets 库的输出目录中创建 ”msw” 或 ”mswd” 目录。
其他问题可参考 wxWidgets 开发者论坛
完。