前言:
由于工作,编译应用层程序、编译动态&静态库、编译Linux驱动模块,因此需要一个强大的Makefile的模板,只需要通过开关方便控制编译方向。
该模板参考了网上许多的Makefile模板,也参考了Linux内核中的Makefile,修改为适应工程使用的Makefile模板,分享出来供大家参考使用。测试可用,若需要使用,需要修改部分参数。
后面附带一个用于Linux源码下的内核配置(.config)、编译内核(zImage)、编译设备树(.dtb)、编译内核模块(.ko)、清除配置的Shell脚本。需要执行某个功能时,指定交叉编译器的命令不可注释(条件),取消注释可实现该功能的命令,其他行功能的命令继续注释。
设置开机自动将交叉编译器的路径添加进环境变量里
# 1 打开/etc/profile文件
$ sudo vim /etc/profile
# 2 将下面的内容添加到/etc/profile文件最后一行
export PATH=$PATH:/XXX/gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux/bin/
# 3 在当前bash环境下读取并执行/etc/profile中的命令
$ source /etc/profile
# 4 检测检查编译器是否可用
$ arm-linux-gnueabihf-gcc -v
1. 编译应用层程序的Makefile模板
# 目标文件的运行平台: ARM x86 MIPS RISC
RUN_ARCH := ARM
# 生成指定的目标文件名,目标文件的拷贝路径
TARGET_FILE := testsizeof
TARGET_PATH := ~/nfs/
# 编译工具
ifeq ($(RUN_ARCH), ARM)
export CROSS := arm-linux-gnueabihf-
else ifeq ($(RUN_ARCH), x86)
export CROSS :=
endif
# CROSS = arm-linux-gnueabihf-
export CC = $(CROSS)gcc
export CXX = $(CROSS)g++
export AR := $(CROSS)ar
export AS := $(CROSS)as
export STRIP := $(CROSS)strip
export CPP = $(CC) -E
export OBJCOPY = $(CROSS)objcopy
export OBJDUMP = $(CROSS)objdump
export NM = $(CROSS)nm
export LD = $(CROSS)ld
# 源文件,自动找所有.c和.cpp文件,并将目标定义为同名.o文件
SOURCE := $(wildcard *.c) $(wildcard *.cpp)
OBJS := $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(SOURCE)))
# 编译参数
LIBS := -L/mnt/hgfs/Share_Ubuntu/Temp_File/test4/Lib/lib
LDFLAGS := -ltest
DEFINES :=
INCLUDE := -I /mnt/hgfs/Share_Ubuntu/Temp_File/test4/Lib/include/
CFLAGS := -g -Wall -O3 $(DEFINES) $(INCLUDE)
CXXFLAGS:= $(CFLAGS) -DHAVE_CONFIG_H
# 下面的基本上不需要做任何改动了
.PHONY : everything objs clean veryclean rebuild
everything : $(TARGET_FILE)
all : $(TARGET_FILE)
objs : $(OBJS)
rebuild: veryclean everything
clean :
rm -rf *.o $(TARGET_FILE)
veryclean : clean
rm -rf $(TARGET_FILE)
# 编译.c/.cpp文件为.o文件
$(OBJS): $(SOURCE)
@echo "\n **** Top Dir **** .c --> .o