代码结构
所有代码都已通过测试跑通,其中代码结构如下:
一、include文件夹
1.1 common.h
#ifndef _COMMON_H
#define _COMMON_Htypedef struct Region {int iLeftUpX; //区域左上方的坐标int iLeftUpY; //区域左下方的坐标int iWidth; //区域宽度int iHeigh; //区域高度
}Region, *PRegion;#endif
1.2 page_manager.h
#ifndef _PAGE_MANAGER_H
#define _PAGE_MANAGER_Htypedef struct PageAction {char *name;void (*Run)(void *pParams);struct PageAction *ptNext;
}PageAction, *PPageAction;void PageRegister(PPageAction ptPageAction);
void PagesRegister(void);
PPageAction Page(char *name);#endif
二、page文件夹
2.1 main_page.c
#include <page_manager.h>
#include <stdio.h>static void MainPageRun(void *pParams)
{printf("%s %s %d\n", __FILE__, __FUNCTION__, __LINE__);
}static PageAction g_tMainPage = {.name = "main",.Run = MainPageRun,
};void MainPageRegister(void)
{PageRegister(&g_tMainPage);
}
2.2 page_manager.c
#include <common.h>
#include <page_manager.h>
#include <string.h>
static PPageAction g_ptPages = NULL;void PageRegister(PPageAction ptPageAction)
{ptPageAction->ptNext = g_ptPages;g_ptPages = ptPageAction;
}PPageAction Page(char *name)
{PPageAction ptTmp = g_ptPages;while (ptTmp){if (strcmp(name, ptTmp->name) == 0)return ptTmp;ptTmp = ptTmp->ptNext;}return NULL;
}void PagesRegister(void)
{extern void MainPageRegister(void);MainPageRegister();
}
2.3 Makefile
EXTRA_CFLAGS :=
CFLAGS_file.o :=
obj-y +=main_page.o
obj-y +=page_manager.o
三、uniotest文件夹
3.1 page_test.c
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <linux/fb.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/ioctl.h>
#include <stdlib.h>#include <page_manager.h>int main(int argc, char **argv)
{PagesRegister();Page("main")->Run(NULL);return 0;
}
3.2 Makefile
EXTRA_CFLAGS :=
CFLAGS_file.o :=
obj-y +=page_test.o
四、顶层Makefile及Makefile.build
4.1 Makefile
#指定交叉编译工具链
COSS_COMPLE ?=arm-linux-gnueabihf-
AS = $(COSS_COMPLE)as
LD = $(COSS_COMPLE)ld
CC = $(COSS_COMPLE)gcc
CPP = $(CC) -E
AR = $(CROSS_COMPILE)ar
NM = $(CROSS_COMPILE)nmSTRIP = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump# export导出的变量是给子目录下的Makefile使用的
export AS LD CC CPP AR NM
export STRIP OBJCOPY OBJDUMP# 编译器在编译时的参数设置
CFLAGS := -Wall -O2 -g -DDEBUG
# 添加头文件路径,不添加的话include目录下的头文件编译时找不到
CFLAGS += -I $(shell pwd)/include# 链接器的链接参数设置,链接库
LDFLAGS :=
#-L/home/alexius/Downloads/tslib-1.21/install/lib -lts -lpthread #触摸屏库链接export CFLAGS LDFLAGSTOPDIR := $(shell pwd)
export TOPDIR# 定义将来编译生成的可执行程序的名字
TARGET := page_test# 添加项目中所有用到的源文件,有顶层目录下的.c文件,和子文件夹
# 添加顶层目录下的.c文件
#obj-y += main.o# 添加顶层目录下的子文件夹(注意目录名后面加一个/)
#obj-y += main.o
obj-y += page/
obj-y += uniotest/# 第一个目标
all : start_recursive_build $(TARGET)@echo $(TARGET) has been built!# 处理第一个依赖,**转到 Makefile.build 执行**
start_recursive_build:make -C ./ -f $(TOPDIR)/Makefile.build# 处理最终目标,把前期处理得出的 built-in.o 用上
$(TARGET) : built-in.o$(CC) -o $(TARGET) built-in.o $(LDFLAGS)# 清理
clean:rm -f $(shell find -name "*.o")rm -f $(TARGET)# 彻底清理
distclean:rm -f $(shell find -name "*.o")rm -f $(shell find -name "*.d")rm -f $(TARGET)
4.2 Makefile.build
# 将__build定义为伪目标
PHONY := __build
__build:# 这里初值为空,下面引入Makefile文件后会被覆盖
obj-y :=
subdir-y :=# 包含同级目录的Makefile
include Makefile# 从obj-y变量中,将"/"结尾的字符串提取出来,也就是包含的子文件夹目录
__subdir-y := $(patsubst %/,%,$(filter %/, $(obj-y)))
subdir-y += $(__subdir-y)# 将subdir-y变量中的字符串依次赋值给f变量,形成新的$(f)/built-in.o字符串
subdir_objs := $(foreach f,$(subdir-y),$(f)/built-in.o)# 筛选出obj-y中不以"/"结尾的字符串,也就是普通文件,一般是.o结尾
cur_objs := $(filter-out %/, $(obj-y))# 为每个.o文件生成.d文件
# 注意.$(f).d是隐藏文件,需要ls -a查看
dep_files := $(foreach f,$(cur_objs),.$(f).d)
dep_files := $(wildcard $(dep_files))# 如果.d文件不是空,则将.d文件都包含进来
ifneq ($(dep_files),)include $(dep_files)
endifPHONY += $(subdir-y)# __build是Makefile的目标__build : $(subdir-y) built-in.o# 依次跳转到子目录中,执行Makefile.build文件
$(subdir-y):make -C $@ -f $(TOPDIR)/Makefile.build# 生成当前目录的built-in.o,依赖当前目录的.o文件和子目录下的built-in.o文件
built-in.o : $(cur_objs) $(subdir_objs)$(LD) -r -o $@ $^# dep_file变量是用来生成.d文件的
dep_file = .$@.d# Makefile中的规则,把.c文件编译成.o文件
%.o : %.c$(CC) $(CFLAGS) -Wp,-MD,$(dep_file) -c -o $@ $<# 重新定义 .PHONY的依赖
.PHONY : $(PHONY)
五、编译及测试结果
5.1 编译
5.2 测试结果
将可执行程序page_test移植到开发板上,运行如下: