您的位置:首页 > 其它

使用Makefile终端参数实现跨平台编译控制

2017-08-07 20:24 274 查看
最近做的项目经常需要在x86和arm两个平台上测试,需要使用两套编译器,一套系统自带,一套来自于交叉编译环境。这时就需要为两个平台分别编写Makefile,但颇为不便。查阅资料后得知可以使用make configure调整编译选项,又显牛刀杀鸡。

一种较为简便的方式是在使用make指令时,添加额外参数以改变脚本中某变量的值,配合Makefile中的条件语句ifeq来控制编译过程。

CFLAGS+=-Werror -O2
ifeq ($(arm),true)
CXX=arm-hisiv300-linux-uclibcgnueabi-g++
CC=arm-hisiv300-linux-uclibcgnueabi-gcc
TARGETNAME=sockcli_arm
else
CXX=g++
CC=gcc
TARGETNAME=sockcli
endif

$(TARGETNAME):main.o send_proc.o recv_proc.o main_proc.o
$(CXX) $(CFLAGS) -o  $(TARGETNAME)  main.o send_proc.o recv_proc.o main_proc.o
main.o:main.cpp send_proc.h recv_proc.h main_proc.h
$(CXX) $(CFLAGS) -c  main.cpp
main_proc.o:main_proc.cpp main_proc.h send_proc.h recv_proc.h
$(CXX) $(CFLAGS) -c  main_proc.cpp
send_proc.o:send_proc.cpp send_proc.h
$(CXX) $(CFLAGS) -c  send_proc.cpp
recv_proc.o:recv_proc.cpp recv_proc.h
$(CXX) $(CFLAGS) -c  recv_proc.cpp

clean:
rm -f $(TARGETNAME) main.o main_proc.o recv_proc.o send_proc.o


编译时,若需编译arm平台程序,使用命令
make arm=true
即可调用交叉编译器;若编译x86平台程序,直接使用
make
命令即可。

需要注意的是,第二行的ifeq和括号之间必须有一个空格。否则,make会报错:

Makefile:2: *** 遗漏分隔符 。 停止。


网上绝大多数解答都是将TAB误写为空格,而此处错误实为缺少空格。不得不说Makefile这个解释性语言很让人恼火,语法严苛,错误提示又不清晰。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  makefile arm 交叉编译