0
点赞
收藏
分享

微信扫一扫

和菜鸟一起深入学习国嵌实验之简单Makefile

大明宫 2023-01-15 阅读 54


 

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



 

 

举报

相关推荐

0 条评论