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)ranlib
CURTDIR = $(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)ranlib
CURTDIR = $(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)ranlib
ROOTDIR =$(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 -ldl
export CC LDSTRIP OBJCOPY OBJDUMP AR RANLIB CFLAGS LDFLAGS AFLAGS INCLUDEDIRS ROOTDIR
.PHONY : all
all : childdir
childdir:
@for dir in $(SUB_DIRS); do \
$(MAKE) -C $$dir || exit 1;\
done
SUB_DIRS = led
install:
mkdir -p ../lib
mkdir -p ../module
dep:
@for dir in $(SUB_DIRS); do \
$(MAKE) -C $$dir dep; \
done
clean:
@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.mk
clean:
rm-rf $(OBJFILE)
rm-rf $(MODULE)
rm-rf depend.mk
-include ./depend.mk
接着你要编译的程序,比如上面的那个程序。
MODULE = libmy_make.so
SRS = $(wildcard *.S)
SRC = my_make.c
OBJFILE = $(SRC:%.c=%.o) $(SRS:%.S=%.o)
include $(ROOTDIR)/Rules.make