miniGUI编译详细过程以及示例
由于最近项目遇到GUI开发,需要用到miniGUI来完成。为什么不用QT?我也一直在疑惑。可能因为跑不动吧。不管了,下面是整个miniGUI编译成功的过程。
miniGUI下载
首先,miniGUI下载的话,去官网相当麻烦,因为官网将先下载一个minigui的核心库,然后是让你运行sh脚本让你去下载的,git最近一直被墙,实在无奈。所以我千辛万苦找到了所有的依赖库和文件,方便直接编译。
资源就在我的csdn资源里面,自己跳转下载哦,因为是放到板子跑,用的是miniGUI-3.2-0.12版本
编译过程
编译真的一波三折,简直吐血,如果你是一个想要学习GUI开发的学生党,那么真的不用搞这个玩意了,没必要折磨自己,直接学QT,还好找工作。项目需求的话,往下看。
文件下载完就上述这些东西,里面划线的不是必须资源,由于划线的资源安装需要QT-3.0
以上的组件,我板子能用QT我还用miniGUI干啥,所以划线的我不用,没安装,具体要用到的,可以百度一下,有详细教程的。
下面开始讲解编译过程:
首先声明一点:miniGUI是针对32位系统写的,如果你想直接在你的64位ubuntu上或者别的linux上跑,真的需要强大的代码能力,你需要改miniGUI的源码,自己移植。举个简单的例子,32为机器和64位机器的指针占字节数不一样就够你头疼的。所以,需要32为的编译器。我这里用的是32位的某厂家(机密)SOC,只要有交叉编译器都好说。
1.首先开始编译 libminigui-3.0.12-linux
cd libminigui-3.0.12-linux
./configure --prefix=$PWD/../build CC=arm-linux--gcc --host=arm-linux- --disable-pcxvfb --enable-autoial --enable-procs --enable-static
上述代码中,CC后面跟你交叉编译器的名字,(是你自己的,不要按部就班),host按照我的格式, 后面的enable-procs
是指--enable-static
是指生成静态库 如果你想要动态库,就直接--enable-share
然后回车,会自动配置makefile,有警告不用管,直接make
就可以了 完了 make install
2.编译freetype-2.3.9-fm20100818
同样,切换进freetype-2.3.9-fm20100818
目录下,然后./configure –prefix=$PWD/../build CC=arm-linux-gcc --host=arm-linux- --enable-static
然后 make
再make install
3.编译jpeg-7
进去后 prefix=$PWD/../build CC=arm-linux-gcc --host=arm-linux- --enable-static
然后 make
再make install 4.编译
libpng-1.2.37进去后
prefix=PWD/…/build CC=arm-linux-gcc --host=arm-linux- --enable-static然后
make再
make install
6.编译zlib-1.2.2
这个稍微有点麻烦,反正我按照上面不可以,我改了他的Makefile 如下:
直接指定交叉编译器即可生成相应的库,libz.a 和zlib.h(搜索一下就找到了)
到这里已经成功了一半。
回到zlib上级目录你会发现多了一个build文件夹,这里面就是你要的东西,包括库文件,头文件,资源文件,和配置文件。
这些就是你要用到的东西
然后就是编译示例代码:
#include <stdio.h>
#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>
static int HelloWinProc(HWND hWnd, int message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
switch (message)
{
case MSG_PAINT:
hdc = BeginPaint(hWnd);
TextOut(hdc, 60, 60, "Hello world!");
EndPaint(hWnd, hdc);
return 0;
case MSG_CLOSE:
DestroyMainWindow(hWnd);
PostQuitMessage(hWnd);
return 0;
}
return DefaultMainWinProc(hWnd, message, wParam, lParam);
}
int MiniGUIMain(int argc, const char *argv[])
{
MSG Msg;
HWND hMainWnd;
MAINWINCREATE CreateInfo;
#ifdef _MGRM_PROCESSES
JoinLayer(NAME_DEF_LAYER, "helloworld", 0, 0);
#endif
CreateInfo.dwStyle = WS_VISIBLE | WS_BORDER | WS_CAPTION;
CreateInfo.dwExStyle = WS_EX_NONE;
CreateInfo.spCaption = "HelloWorld";
CreateInfo.hMenu = 0;
CreateInfo.hCursor = GetSystemCursor(0);
CreateInfo.hIcon = 0;
CreateInfo.MainWindowProc = HelloWinProc;
CreateInfo.lx = 0;
CreateInfo.ty = 0;
CreateInfo.rx = 240;
CreateInfo.by = 180;
CreateInfo.iBkColor = COLOR_lightwhite;
CreateInfo.dwAddData = 0;
CreateInfo.hHosting = HWND_DESKTOP;
hMainWnd = CreateMainWindow(&CreateInfo);
if (hMainWnd == HWND_INVALID)
return -1;
ShowWindow(hMainWnd, SW_SHOWNORMAL);
while (GetMessage(&Msg, hMainWnd))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
MainWindowThreadCleanup(hMainWnd);
return 0;
}
#ifndef _MGRM_PROCESSES
#include <minigui/dti.c>
#endif
make如下:
PRJ := minigui_init
CROSSCOMPILE := (你的交叉编译器)
CFLAGS := -Wall -O2 -c
CFLAGS += -I/data1/xxx/miniGUI/build/include(build的头文件路径)
LDFLAGS := -L/data1/xxx/miniGUI/build/lib -lminigui_procs -ljpeg -lpng -ldl -lm -lpthread (库路径)
CC := $(CROSSCOMPILE)gcc
LD := $(CROSSCOMPILE)ld
SRC = helloworld.c
OBJS := \
$(patsubst %.c, %.o, $(filter %.c, $(SRC))) \
$(patsubst %.cpp, %.o, $(filter %.cpp, $(SRC))) \
$(patsubst %.s, %.o, $(filter %.s, $(SRC)))
all: $(OBJS)
$(CC) $(LDFLAGS) -o $(PRJ) $^
clean:
rm -f *.o
rm -f $(OBJS) $(PRJ)
%.o:%.c
$(CC) $(CFLAGS) -o aaa@qq.com $<
生成可执行文件。
然后把/build/etc
下的MiniGUI.cfg
改一下,分辨率啥的,
最后一步:
将build的bin下面的所有文件复制到板子的/bin
将build的etc下面的所有文件复制到板子的/etc
将build的lib下面的所有文件复制到板子的/lib
将build的include下面的所有文件复制到板子的/usr/local/include
或者,你可以直接把bulid放板子的某个路径,设置环境变量,在板子上就可以运行demo了。