【开发工具】之linux下makefile编写

在实际工程中,我们通常使用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值