1、首先是待make的程序:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>int main(void)
{printf("Hello Makefile!\n");return 0;
}
2、其次就是其makefile了:
CC = $(CROSS_COMPILE)gcc
LD = $(CROSS_COMPILE)ld
STRIP = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
AR = $(CROSS_COMPILE)ar
RANLIB = $(CROSS_COMPILE)ranlibCURTDIR = $(shell pwd)
TARGET = my_make%.o:%.c$(CC)-c $(EXTRAFLAGS) $< -o $@
%.o:%.S$(CC)-c $(EXTRAFLAGS) $< -o $@.PHONY: all clean$(TARGET): $(TARGET).o$(CC) -o $@ $^clean:rm-rf $(TARGET) $(TARGET).o
如果是要交叉编译的话,那么就如下:
CROSS_COMPILE =/usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-CC = $(CROSS_COMPILE)gcc
LD = $(CROSS_COMPILE)ld
STRIP = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
AR = $(CROSS_COMPILE)ar
RANLIB = $(CROSS_COMPILE)ranlibCURTDIR = $(shell pwd)
ROOTDIR = $(CURDIR)/../..
TARGET = my_make#CFLAGS = -I$(ROOTDIR)/src/inc -EL
#LDFLAGS = -EL -L$(ROOTDIR)/lib -lled
CFLAGS = -I$(ROOTDIR)/src/inc
LDFLAGS = -L$(ROOTDIR)/lib -lled%.o:%.c$(CC)-c $(CFLAGS) $(EXTRAFLAGS) $< -o $@
%.o:%.S$(CC)-c $(CFLAGS) $(EXTRAFLAGS) $< -o $@.PHONY: all clean$(TARGET): $(TARGET).o$(CC)$(LDFLAGS) -o $@ $^clean:rm-rf $(TARGET) $(TARGET).o
以上是编译成可执行文件的,如果要编译成.so文件呢?那么其makefile要怎么实现呢?
1、 首先是最外面的makefile了
CROSS_COMPILE=/usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-CC =$(CROSS_COMPILE)gcc
LD =$(CROSS_COMPILE)ld
STRIP =$(CROSS_COMPILE)strip
OBJCOPY =$(CROSS_COMPILE)objcopy
OBJDUMP =$(CROSS_COMPILE)objdump
AR =$(CROSS_COMPILE)ar
RANLIB =$(CROSS_COMPILE)ranlibROOTDIR =$(shell pwd)
INCLUDEDIRS =-I$(ROOTDIR)/inc#LIB_DIR =/opt/mips-linux-gnu-4.3.-51/mips-linux-gnu/libc/el/usr/lib#CFLAGS = -O0-g3 -EL -Wall $(INCLUDEDIRS) -mhard-float -fPIC
CFLAGS = -O0 -g3-EL -Wall $(INCLUDEDIRS) -fPIC
AFLAGS = -O0 -g3-EL -Wall $(INCLUDEDIRS) -mmt -fPIC
LDFLAGS = -EL-fPIC -shared -LLIB_DIR -lm -lpthread -lc -ldlexport CC LDSTRIP OBJCOPY OBJDUMP AR RANLIB CFLAGS LDFLAGS AFLAGS INCLUDEDIRS ROOTDIR.PHONY : allall : childdirchilddir:
@for dir in $(SUB_DIRS); do \$(MAKE) -C $$dir || exit 1;\
doneSUB_DIRS = ledinstall:
mkdir -p ../lib
mkdir -p ../moduledep:
@for dir in $(SUB_DIRS); do \$(MAKE) -C $$dir dep; \
doneclean:
@for dir in $(SUB_DIRS); do\$(MAKE) -C $$dir clean; \
done
然后是其Rules.make
$(MODULE) : $(OBJFILE) $(LLIBS)@echo[LD] $@$(CC)$(LDFLAGS) -o $(MODULE) $(OOBJFILE)mv$(MODULE) $(ROOTDIR)/../lib%.o:%.c$(CC)-c $(CFLAGS) $(EXTRAFLAGS) $< -o $@
%.o:%.S$(CC)-c $(CFLAGS) $(EXTRAFLAGS) $< -o $@dep:$(CC)$(INCLUDEDIRS) -M $(SRC) > ./depend.mkclean:rm-rf $(OBJFILE)rm-rf $(MODULE)rm-rf depend.mk-include ./depend.mk
接着你要编译的程序,比如上面的那个程序。
MODULE = libmy_make.soSRS = $(wildcard *.S)
SRC = my_make.cOBJFILE = $(SRC:%.c=%.o) $(SRS:%.S=%.o)include $(ROOTDIR)/Rules.make