一、编译环境准备:
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)
================================================================