简易Makefile编写流程_20160917

来源:互联网 发布:r语言处理csv数据 编辑:程序博客网 时间:2024/05/22 06:19
一、编译环境准备:
    1、指定编译器;
    |---如CROSS_COMPILE = arm-hisiv100nptl-linux-  ;
   2、指定编译器类型;
    |---如 gcc 、g++;
   3、指定链接方法;
    |---g++ -o或者g++-ar cr
    4、指定编译选项;
    |---如-Wall -DBSD=1 -DLOCALE_NOT_USED

二、依赖关系形成:     
   1、指定目标文件名;
    |---如 LIVE_LIB := LibBufferApi.a  LibBufferApi.so;   
    2、指定依赖头文件目录;
    |---如,INCLUDE_DIRS +=-I./   
    3、使用wildcard指定依赖的源码文件;
    |---如,DIR_C +=$(wildcard *.c)       
    4、使用patsubst将依赖的源码文件转换成链接文件*.o
    |---如,LIBOBJ +=$(patsubst %.c,%.o,$(DIR_C))

三、编写每个依赖生成的指令:
1、编写为all的目标,然后将最顶层的依赖原则写在all的后面;
    |---如,all:$(LIB_NAME)
2、然后依次编写目标为all依赖文件的生成规则;
    |---如
================================================================
.PHONY:LibBufferAPI.so
LibBufferAPI.so:
    $(CC) $(DIR_C) $(DIR_CPP) $(INCLUDE_DIRS) $(LIBRARY_DIRS) $(CFLAGS) $(CXXFLAGS) $(LDFLAGS) $(LOPTION) -o $@ -shared -fPIC
    $(STRIP) $@ $(STRIPFLAGS) 


.PHONY:LibBufferAPI.a
LibBufferAPI.a:
    $(CC) -c  $(INCLUDE_DIRS) $(DIR_C) $(DIR_CPP)  $(CFLAGS) $(CXXFLAGS) $(LOPTION)
    $(AR) rv $@ $(LIBOBJ)
    $(STRIP) $@ $(STRIPFLAGS)
===============================================================   
3、编写目标为clean的规则,用你来清理工程编译后的文件;
    |---如,
================================================================
.PHONY:clean
clean:
    rm -rf $(LIB_NAME) $(LIBOBJ)
================================================================

4、完整sample:
================================================================
CHIP_PLATFORM:=Hi-3531_V100
#CHIP_PLATFORM:=Hi-3531A_V300

#Toolchain
ifeq ($(CHIP_PLATFORM), Hi-3531_V100)
CROSS_COMPILE:=arm-hisiv100nptl-linux-
else
ifeq ($(CHIP_PLATFORM), Hi-3531A_V300)
CROSS_COMPILE:= /opt/hisi-linux/x86-arm/arm-hisiv300-linux/target/bin/arm-hisiv300-linux-
endif
endif

LIB_NAME := libjnvsdk.so libjnvsdk.a

CC := $(CROSS_COMPILE)gcc
CXX := $(CROSS_COMPILE)g++
LD := $(CROSS_COMPILE)ld
AR := $(CROSS_COMPILE)ar
OBJCOPY := $(CROSS_COMPILE)objcopy
STRIP := $(CROSS_COMPILE)strip
STRIPFLAGS := -g --strip-unneeded

#Additional flags

INCLUDE_DIRS += -I./    \
                -I./inc \
                -I./open_interface

LIBRARY_DIRS += -L./    \
                -L./lib


DIR_C +=$(wildcard ./*.c)
DIR_C +=$(wildcard ./src/*.c)

DIR_CPP +=$(wildcard ./*.cpp)
DIR_CPP +=$(wildcard ./src/*.cpp)

LIBOBJ :=
LIBOBJ +=$(patsubst %.c,%.o,$(DIR_C))
LIBOBJ +=$(patsubst %.cpp,%.o,$(DIR_CPP))

#C部分指定宏用
CFLAGS += -DLINUX_PLATFORM=1
#C++部分指定宏用 
CXXFLAGS += 
#链接库名称
LDFLAGS += -lpthread -lstdc++
#编译选项
LOPTION += 

all:$(LIB_NAME)

.PHONY:libjnvsdk.so
libjnvsdk.so:
    $(CC) $(DIR_C) $(DIR_CPP) $(INCLUDE_DIRS) $(LIBRARY_DIRS) $(CFLAGS) $(CXXFLAGS) $(LDFLAGS) $(LOPTION) -o $@ -shared -fPIC
    $(STRIP) $@ $(STRIPFLAGS) 


.PHONY:libjnvsdk.a
libjnvsdk.a:
    $(CC) -c  $(INCLUDE_DIRS) $(DIR_C) $(DIR_CPP)  $(CFLAGS) $(CXXFLAGS) $(LOPTION) 
    $(AR) rv $@ $(LIBOBJ)
    $(STRIP) $@ $(STRIPFLAGS)


.PHONY:clean
clean:
    rm -rf $(LIB_NAME) $(LIBOBJ)
================================================================
1 0
原创粉丝点击