目标
建立一个开发 GUI 交互界面程序的环境,要求:
以 C/C++ 为主要程序设计语言。
最好能充分利用已有的 MFC 开发经验。
以 Linux 为主要开发环境。可以在 Windows 中编译并发布程序。
根据以上要求选择:
Archlinux / Windows XP
CodeBlocks + wxWidgets
在 Archlinux 中使用 CodeBlocks + wxWidgets 比较简单,此文中不再赘述。
Windows XP 运行在 Virtualbox 中,因此编译器选用无 IDE 的 VC2010 精简版,仅使用 NMAKE 命令行编译,无需MFC、ATL、Platform SDK等。
下文中如无特别声明,均在 Windows XP 中操作。
安装目录
VC2010 安装在 Windows XP 的C盘根目录。文件夹名为:C:\VC2010
。
wxWidgets 解压缩到 Linux 与 Windows 的共享文件夹中。例如:
Linux 目录为 /mnt/sda2/wxWidgets
。
Windows 目录为 e:\mnt\sda2\wxWidgets
,下文用nmake宏变量$(WX_ROOT)
代表。
备注:
可以把 VC2010 也许放在共享文件夹,wxWidgets 放在 VC2010 文件夹下。
设置 VC2010
建立批处理文件 C:\VC2010\VC2010.bat
@echo VC 2010 编译器
@echo --------------------------------------
@echo CL.exe 控制 Microsoft C 和 C++
@echo 编译器与链接器
@echo --------------------------------------
@echo LINK 是将通用对象文件格式 (COFF) 对象文件和
@echo 库链接起来以创建 32 位可执行 (.exe) 文件或
@echo 动态链接库 (DLL) 的 32 位工具。
@echo --------------------------------------
@echo rc 是资源编译
@echo --------------------------------------
@echo off
set PATH=%CD%\bin;%PATH%
set INCLUDE=%CD%\include
set LIB=%CD%\lib
rem color 0e
title VC2010 x86 命令提示
"%comspec%"
建立快捷方式 C:\VC2010\VC2010.lnk
修改 VC2010.lnk
的属性。
在快捷方式
页将目标
设置为:%comspec% /k "VC2010.bat"
在布局
页将屏幕缓冲区大小
和窗口大小
的宽度
设置为:132。窗口大小
的高度设置为:43。
运行 C:\VC2010\VC2010.lnk
,在 CMD 窗口中输入命令nmake
并回车。如果可以运行,说明设置正确。
设置编译 wxWidgets
运行C:\VC2010\VC2010.lnk
,打开命令行窗口。
进入 wxwidgets 的编译目录$(WX_ROOT)\build\msw
:
E:
cd \sda2\wxWidgets\build\msw
清理原来的目标文件:
nmake -f makefile.vc clean
修改 wxWidgets 编译选项 $(WX_ROOT)\build\msw\config.vc
,获得最小体积的EXE执行文件:
参考 wxWidgets 2.9.2svn(3.x)最小体积编译方法
CPPFLAGS = /Os
LDFLAGS = /MANIFEST:NO /OPT:REF /OPT:ICF
BUILD = release
SHARED=0
UNICODE=1
DEBUG_INFO=0
DEBUG_FLAG=0
MONOLITHIC=0
OFFICIAL_BUILD=1
RUNTIME_LIBS=static
执行编译:
nmake -f makefile.vc clean
编译过程结束后,在 $(WX_ROOT\build\msw\vc_mswu)
目录中留下了约 500M 的 obj 文件。可以直接删除 vc_mswu 目录。
编译示例程序。进入 listctl 所在的目录$(WX_ROOT)\sample\listctl
cd ..\..\sample\listctl
nmake -f makefile.vc clean
nmake -f makefile.vc
如果一切正常,在子目录 listctl\vc_mswu 中将产生约 1.7M 大小的可执行文件 listctl.exe。
用 UPX 压缩可执行文件。安装 UPXSHELL 或者 UPX Easy GUI,可以将 listctl.exe 压缩到 700K 左右。这已经接近 VC / MFC 程序的大小了。
脱离 wxWidgets 的 samples 目录用 nmake 单独编译示例程序 listctl
用 nmake 编译 listctl 的关键是建立 makefile.vc 文件,但 wxwidgets 示例程序的 makefile.vc 使用的是相对路径,因此需要我们做一些修改。
先将 listctl 文件夹拷贝到 wxWidgets 以外的其它目录中。
修改 VC2010.bat 批处理命令。增加设置 WX_ROOT 环境变量。
set WX_ROOT=e:\sda2\wxWidgets
修改 listctl 文件夹中的 makefile.vc:
用
$(WX_ROOT)
代替.\..\..
。用
$(WX_ROOT)
代替../..
。
将 $(WX_ROOT)\samples
下面的三个文件:
- sample.rc
- sample.ico
- sample.xpm
拷贝到 listctl 的 上一级目录 。如此可在 listctl 目录 运行 nmake -f makefile.vc
编译出可执行文件。
Tips
在 windows 中编译 wxAboutBox
这是属于 wxAdvanced 库的,一般情况下,编译时没有链接该库。
修改 makefile.vc 增加一下内容:
!if "$(MONOLITHIC)" == "0"
__WXLIB_ADV_p = \
wx$(PORTNAME)$(WXUNIVNAME)$(WX_RELEASE_NODOT)$(WXUNICODEFLAG)$(WXDEBUGFLAG)$(WX_LIB_FLAVOUR)_adv.lib
!endif
新增链接库:$(__WXLIB_ADV_p)
在 linux codeblocks 环境下编译 wxAui
增加 /usr/lib/libwx_gtk2u_aui-3.0.so
到链接库中。
WXUNUSED 的用途
在 windows vc2010 环境下编译时,如果函数未使用某个参数时,编译程序报错:
warning C4100: 'event' : unreferenced formal parameter
原来的程序:
void LogMonFrame::OnQuit(wxCommandEvent& event)
{
Destroy();
}
改成:
void LogMonFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
Destroy();
}
即可。
即将
void LogMonFrame::OnQuit(wxCommandEvent& event)
改成
void LogMonFrame::OnQuit(wxCommandEvent&)