代码结构
所有代码都已通过测试跑通,其中代码结构如下:
一、include文件夹
1.1 common.h
#ifndef _COMMON_H
#define _COMMON_H
typedef 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_H
typedef 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)nm
STRIP = $(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 LDFLAGS
TOPDIR := $(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)
endif
PHONY += $(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移植到开发板上,运行如下: