说明
嵌入式端运行的程序,时常需要同时编译一份上位机的版本,供后续调试。Makefile中可以方便的通过如下代码
FLAG LINUXFLAG
#ifdef FLAG
//编译LINUX版本工程
#else
//编译ARM版本工程
#endif
的方式,采用不同的编译器和库文件,分别编译针对上位机和Linux版本的程序。
同时,可以在Makefile中通过-DMYVAL的方式(相当于所有文件中均添加了#define MYVAL),之后在对应的文件中,定义类似如下的代码,即可实现利用上下位机编译相同的代码,只需修改Makefile开头定义的变量,即可编译上下位机同时运行的文件。
#ifdef T3BOARD
ofstream boxout("result_ARM.txt");
#else
ofstream boxout("result_linux.txt");
#endif
Makefile实例
#set targetname
target:=mydemo
#set cross compile flag
#TG=x86
ifeq ($(TG),x86)
DEFINES = -DAT_LINUX
else
DEFINES = -DT3BOARD -mfpu=neon
endif
#set base path
LICHEE_DIR=/home/jerry/workspace/t7linux-auto/
#set SRCS and OBJS
SRCS := $(wildcard ./src/*.cpp)
OBJS := $(patsubst %cpp,%o,$(SRCS))
CFLAGS = -g -Wall
CFLAGS += -I.
CFLAGS += -I./inc
CFLAGS += -I./rapidxml-1.13
ifeq ($(TG),x86)
CXX = g++
LIBS :=-L/usr/local/lib
else
CXX = $(LICHEE_DIR)out/sun8iw17p1/linux/common/buildroot/host/opt/ext-toolchain/bin/arm-linux-gnueabi-g++
LIBS :=-L/home/jerry/opencv_arm_lib/lib
CFLAGS += -I/home/jerry/opencv_arm_lib/include/opencv/
CFLAGS += -I/home/jerry/opencv_arm_lib/include/
endif
LIBS +=-lopencv_calib3d -lopencv_imgproc -lopencv_video
LIBS +=-lopencv_core -lopencv_ml
LIBS +=-lopencv_features2d -lopencv_objdetect -lopencv_videoio
LIBS +=-lopencv_flann -lopencv_imgcodecs
LIBS +=-lopencv_highgui
${target}: $(OBJS)
${CXX} -o $@ $^ ${CFLAGS} ${LIBS}
#this line should add -mfpu = neon when compile in arm-ruT7
%.o:%.cpp
ifeq ($(TG),x86)
${CXX} -c -o $@ $< ${CFLAGS} ${DEFINES}
else
${CXX} -c -o $@ $< ${CFLAGS} ${DEFINES}
endif
clean:
rm -f ./src/*.o ${target}
如上makefile中,注释掉TG = x86,则编译上位机代码;打开,则编译下位机代码。
补充一下,可以将TG=x86始终注释掉,改用如下脚本实现编译:
APPDIR=$PWD
make clean
make TG=$1 -f Makefile -j
假设脚本名称为mk,则./mk x86执行编译上位机的代码,./mk ARM执行编译下位机的代码。