makefile编写通用模板 可切换交叉编译与G++

切换主要用到ifeq ($(a),n)
即使用变量a的赋值不同作为判断条件
具体语法为

ifeq ($(条件变量),y)
	#语句一
else
	#语句二
endif

所以切换编译工具链可以通过改变CC的值即可,具体通用Make file文件如下:

ARCH:=arm
TESTINBOARD=n
ARCHITECTURE:=/home/xxx1/arm-linux-gnueabi-
ifeq ($(TESTINBOARD),y)
	CROSS_COMPILE:= $(ARCHITECTURE)
else
	CROSS_COMPILE:= 
endif
#TARGET
TARGET = test
#SOURCES
SOURCES = test.cpp
#OBJECTS
OBJECTS = ${
     SOURCES:.cpp=.o}


CFLAGS := -g -Wall -O3 -Werror
#
CPPFLAGS += $(CFLAGS)
#env1的环境
ENV1_DIR=/home/xxx2/env1
#env2的环境
ENV2_DIR=/home/xxx3/env2

#EXTRA_CFLAGS
EXTRA_CFLAGS += -I$(ENV1_DIR)/include
EXTRA_CFLAGS += -I$(ENV2_DIR)/share/

ENV1_LIBDIR=$(ENV1_DIR)/lib
#LIBS
LDFLAGS += -L${
     ENV1_LIBDIR} -lsqlite3
#(-L+lib地址)
#(-l+lib库名)
LDFLAGS += -lpthread -lm


#CC = $(CROSS_COMPILE)g++
CC = $(CROSS_COMPILE)g++

$(TARGET):$(OBJECTS)
ifeq ($(TESTINBOARD),y)
	$(CC) $(CPPFLAGS) -o $(TARGET) ${
     OBJECTS} $(LDFLAGS)
else
	$(CC) $(CPPFLAGS) -o $(TARGET) ${
     OBJECTS}
endif
	
$(OBJECTS): $(SOURCES)
	$(CC) $(CPPFLAGS) -o $@ -c $<
.PHONY:
	clean
clean:
	rm -f $(TARGET)
	find ./ -name "*.o" |xargs rm -rf

对于通用文档编写来说以下几个点比较关键
1.源文件管理

#SOURCES
SOURCES = test.cpp
SOURCES += 源文件2.cpp
SOURCES += 源文件3.cpp
#OBJECTS
OBJECTS = ${
     SOURCES:.cpp=.o}

2.目标文件编译

$(TARGET):$(OBJECTS)
	$(CC) $(CPPFLAGS) -o $(TARGET) ${
     OBJECTS} $(LDFLAGS)

3.源文件编译

$(OBJECTS): $(SOURCES)
	$(CC) $(CPPFLAGS) -o $@ -c $<

或者

$(OBJECTS): $(SOURCES)
	$(CC) $(CPPFLAGS) -o $@ -c $^

或者

$(OBJECTS): $(SOURCES)
	$(CC) $(CPPFLAGS) -o $(OBJECTS) -c $(SOURCES)

三者区别待后续补充

你可能感兴趣的:(兔小子备忘录,makefile)