序
在实际工程中,我们通常使用makefile来构建目标文件,本文旨在示例一个简单的makefile,可根据实际需要更改。
1. 配置相关的宏在config.mk中
新建config,mk
#检测系统
OS = $(shell uname)
#设置是否调试
ifeq ($(DEBUG), 0)
DEBUG_FLAGS := -O3
else
DEBUG_FLAGS := -G
endif
#########################################
############linux系统 ###################
ifeq ($(findstring Linux, $(OS)), Linux)
CROSS ?=
CC := $(CROSS)gcc -fPIC -DPIC
CPP := $(CROSS)g++ -fPIC -DPIC
LD := $(CROSS)ld
AR := $(CROSS)ar
ASM := yasm -DPIC
###ARM32架构
ifeq ($(platform), arm32)
ARCH_DEF :=
EXTRA_CFLAGS := -march=armv7-a -marm $(ARCH_DEF)
EXTRA_LFLAGS := -march=armv7-a -marm
EXTRA_AFLAGS := -march=armv7-a $(ARCH_DEF)
OUT_DIR := ./bin/arm32
endif
###ARM64架构
ifeq ($(platform), arm64)
ARCH_DEF :=
EXTRA_CFLAGS := -march=armv8-a $(ARCH_DEF)
EXTRA_LFLAGS := -march=armv8-a
EXTRA_AFLAGS := -march=armv8-a $(ARCH_DEF)
OUT_DIR := ./bin/arm64
endif
###X86_32架构
ifeq ($(platform), x86_32)
ARCH_DEF :=
EXTRA_CFLAGS := -m32 $(ARCH_DEF)
EXTRA_LFLAGS := -m32 -shared
EXTRA_AFLAGS := -m x86 $(ARCH_DEF)
OUT_DIR := ./bin/x86m32
endif
###X86_64架构
ifeq ($(platform), x86_64)
ARCH_DEF :=
EXTRA_CFLAGS := -m64 $(ARCH_DEF)
EXTRA_LFLAGS := -m64 -shared -Wl, -Bsymbolic
EXTRA_AFLAGS := -m amd64 $(ARCH_DEF)
OUT_DIR := ./bin/x86m64
endif
endif
#########################################
############MAC/IOS系统 ###################
ifeq ($(findstring Darwin, $(OS)), Darwin)
###MAC平台
ifeq ($(target_plat), mac)
CROSS ?=
CC := $(CROSS)gcc -fPIC -DPIC
CPP := $(CROSS)g++ -fPIC -DPIC
AR := $(CROSS)ar
ASM := yasm -DPIC
##X86_32架构
ifeq ($(platform), x86_32)
ARCH_DEF :=
EXTRA_CFLAGS := -m32
EXTRA_LFLAGS := -m32 -dynamiclib -Wl, -dynamic -Wl, -read_only_relocs, suppress
EXTRA_AFLAGS := -f macho32 -m x86
OUT_DIR := ./bin/mac32
endif
##X86_64架构
ifeq ($(platform), x86_64)
ARCH_DEF :=
EXTRA_CFLAGS := -m64
EXTRA_LFLAGS := -m64 -dynamiclib -Wl, -dynamic
EXTRA_AFLAGS := -f macho64 -m amd64
OUT_DIR := ./bin/mac64
endif
endif
###IOS平台
ifeq ($(target_plat), ios)
CROSS := iphone
ifeq ($(platform), ios32)
CC := xcrun -sdk $(CROSS)os clang
CPP := g++
AR := ar
ASM := gas-preprocessor.pl -arch arm -as-type apple-clang --$(CC)
ARCH_DEF :=
EXTRA_CFLAGS := -arch armv7 -mios-version-min=6.0
EXTRA_LFLAGS := -arch armv7 -mios-version-min=6.0
EXTRA_AFLAGS := -arch armv7 -mios-version-min=6.0
OUT_DIR := ./bin/ios32
endif
ifeq ($(platform), ios64)
CC := xcrun -sdk $(CROSS)os clang
CPP := g++
AR := ar
ASM := gas-preprocessor.pl -arch aarch64 -as-type apple-clang --$(CC)
ARCH_DEF :=
EXTRA_CFLAGS := -arch arm64 -mios-version-min=6.0
EXTRA_LFLAGS := -arch arm64 -mios-version-min=6.0
EXTRA_AFLAGS := -arch arm64 -mios-version-min=6.0
OUT_DIR := ./bin/ios64
endif
ifeq ($(platform), ios_sim32)
CC := xcrun -sdk $(CROSS)simulators clang
CPP := g++
AR := ar
ASM := yasm
ARCH_DEF :=
EXTRA_CFLAGS := -arch i386 -mios-simulator-version-min=6.0
EXTRA_LFLAGS := -arch i386 -mios-simulator-version-min=6.0 -Wl, -Bsymbolic-functions -read_only_relocs suppress
EXTRA_AFLAGS := -f macho32 -m x86
OUT_DIR := ./bin/ios_sim
endif
ifeq ($(platform), ios_sim64)
CC := xcrun -sdk $(CROSS)simulators clang
CPP := g++
AR := ar
ASM := yasm
ARCH_DEF :=
EXTRA_CFLAGS := -arch x86_64 -mios-simulator-version-min=6.0
EXTRA_LFLAGS := -arch x86_64 -mios-simulator-version-min=6.0
EXTRA_AFLAGS := -f macho64 -m amd64
OUT_DIR := ./bin/ios_sim
endif
endif ##ifeq ($(target_plat), ios)
endif
2. 构建法则在makefile中
新建Makefile
include config.mk
SRC_PATH := ../src
INCLUDE_PATH:= ../include
LIB_PATH := $(OUT_DIR)
LIB_NAME := xxx
ARFLAGS := cru
CFLAGS := $(DEBUG_FLAGS)
CFLAGS +=$(EXTRA_CFLAGS) -I$(INCLUDE_PATH)
ASMFLAGS :=
ASMFLAGS += $(EXTRA_AFLAGS) -I$(INCLUDE_PATH)
LDFALGS := -lm -ldl
LDFALGS += $(EXTRA_LFLAGS)
LIB := $(LIB_PATH)/$(LIB_NAME).a $(LIB_PATH)/$(LIB_NAME).so
OBJS := $(SRC_PATH)/x.o \
$(SRC_PATH)/y.o
all: clean $(LIB)
$(filter %.a, $(LIB)):$(OBJS)
$(AR) $(ARFLAGS) $@ $^
$(filter %.so, $(LIB)):$(OBJS)
$(CC) $(LDFALGS) -shared -o $@ $^
%.o:%.c
$(CC) -o $< $(CFLAGS) -o $@
%.o:%.asm
$(ASM) $< $(ASMFLAGS) -o $@
clean:
rm -rf $(OBJS)
rm -rf $(LIB)
附录A
A.1 ios下多个架构的静态库打包成一个静态库的方法
lipo -create $(shell pwd)/../* -output $(shell pwd)/../xxx.a
1、参考网址:https://bitmingw.com/2015/03/21/general-makefile/
2、参考网址:https://github.com/switchbrew/34c3-demo/blob/master/Makefile