20190902:编译单一文件测试程序:
# Makefile
CC=gcc
SRCS := $(wildcard *.c)
TARGET := $(SRCS:%.c=%)
$(TARGET):$(SRCS)
$(CC) $(SRCS) -o $(TARGET)
.PHONY : clean
clean:
rm -f $(TARGET)
20190518:编译cpp:
############ 交叉编译
CROSS_COMPILE=aarch64-himix100-linux-
CC=$(CROSS_COMPILE)g++
# 当前路径
PWD := $(shell pwd)
#库
LIB += -lpthread -lsqlite3
#参数
CFLAG= -D_GNU_SOURCE -D__USE_XOPEN -g
#.cpp源文件
SRCS=$(wildcard ./src/*.cpp)
#头文件
INC=-I$(PWD)/include
#中间文件
OBJS=$(SRCS:.cpp=.o)
#二进制文件
BIN=maincpp
#start,表示开始执行
start:$(OBJS)
$(CC) -o $(BIN) $(OBJS) $(CFLAG) $(LIB)
.cpp.o:
$(CC) $(INC) -o $@ -c $< $(CFLAB) $(LIB)
.PHONY : clean
clean:
rm -f ${BIN} ./src/*.o
最新模板
############ GCC编译
CROSS_COMPILE=
############ 交叉编译
#CROSS_COMPILE=aarch64-himix100-linux-
CC=$(CROSS_COMPILE)gcc
AR=$(CROSS_COMPILE)ar
########################### X86
ifeq ($(CC),gcc)
#二进制文件
BIN=client
STATIC_LIB=
DYNAMIC_LIB=
#库链接
LIB=-lm -lpthread -lrt -lsqlite3
########################### ARM
else
BIN=
#静态库
STATIC_LIB=
#STATIC_LIB= libclient.a
#DYNAMIC_LIB=
#动态库
DYNAMIC_LIB=libcm_jt808.so
#库
LIB +=-lm -lpthread -lrt -lsqlite3
LIB +=-lcm_gps -lcmfs1.0 -lcm_inquiry_file -lcmmp4 -lstdc++
endif
#参数
CFLAG= -D_GNU_SOURCE -D__USE_XOPEN -g
#.c源文件
SRC=$(wildcard ./src/*.c)
#.h源文件
HEAD_SRC=$(wildcard ./include/*.h)
#.o中间文件
OBJ=$(SRC:%.c=%.o)
all: ${BIN} ${STATIC_LIB} ${DYNAMIC_LIB}
#编译生成.o中间文件
%.o: %.c %.h
${CC} -c ${CFLAG} $< -o $@
#编译生成二进制文件
${BIN}: ${OBJ} ${HEAD_SRC}
${CC} -o $@ ${OBJ} ${CFLAG} ${LIB}
#编译静态库
${STATIC_LIB}: ${OBJ} ${HEAD_SRC}
${AR} -cvq $@ ${OBJ}
#编译动态库
${DYNAMIC_LIB}: ${SRC} ${HEAD_SRC}
${CC} -shared -fPIC -Wall -o $@ ${SRC} ${CFLAG}
.PHONY : clean
clean:
rm -f ${BIN} ${OBJ} ${STATIC_LIB} ${DYNAMIC_LIB} *.o *.a *.so
文件目录树结构为:
root@ubuntu:/home# tree
.
├── include
│ ├── client.h
│ ├── gps_module.h
│ └── jt.h
├── Makefile
└── src
├── client.c
├── gps_module.c
└── jt.c
2 directories, 7 files
root@ubuntu:/home#
Makefile文件源码为:
#编译器
cc = gcc
#目标文件
prom = client
#编译参数(程序中使用了多线程,所以使用lpthread)
CFLAGS = -lpthread
#源文件
src = $(shell find ./src/ -name "*.c")
#中间文件
obj = $(prom).o
#根据中间文件编译生成 目标文件
$(prom): $(obj)
$(cc) $(obj) -o $(prom) $(CFLAGS)
#根据源文件生成 中间文件
$(obj): $(src)
$(cc) -c $(src)
#clean
clean:
rm -rf $(prom) *.o
编译过程:
root@ubuntu:/home# ls
include Makefile src
root@ubuntu:/home# make
gcc -c ./src/client.c ./src/jt.c ./src/gps_module.c
lgcc client.o -o client -lpthread
root@ubuntu:/home# ls
client client.o gps_module.o include jt.o Makefile src
root@ubuntu:/home#
写的不是很规范(自己的程序可以将就用)大家酌情参考。
20181218更新:
#gcc
cc = gcc
#Hi3559
#cc = arm-hisiv600-linux-gcc
#cc = arm-hisiv600-linux-g++
#ar = arm-hisiv600-linux-ar
#Hi3559A
#cc = aarch64-himix100-linux-gcc
########################### 链接 ###################
#-lrt参数是为了实时库 librt ,没有该参数会报错
CFLAGS = -lpthread -lrt
socf = -fPIC -shared
########################### 源文件 #################
#.c文件
src = $(shell find ./src/ -name "*.c")
#src = $(shell find ./ -name "*.c")
#中间.o文件
osrc = $(shell find ./ -name "*.o")
######################### 目标文件 ################
#编译生成的中间文件
obj = $(prom).o
#编译成二进制文件
prom = client
#编译成静态库
aprom = libclient.a
soprom = libclient.so
########################## 由.o文件编译生成目标文件 #####
ifeq ($(cc),gcc)
#编译出二进制文件
$(prom): $(obj)
$(cc) $(osrc) -o $(prom) $(CFLAGS)
else
#编译出静态库
$(aprom): $(obj)
$(ar) rcs -o $(aprom) $(osrc)
#endif
#$(aprom): $(obj)
#$(ar) rcs -o $(soprom) -o $(socf)
endif
######################## 由.c文件编译生成.o文件 ########
#.c文件编译生成.o文件
$(obj): $(src)
$(cc) -c $(src) $(CFLAGS)
#$(cc) -c $(src) $(CFLAGS)-lcppdeque.so
#$(cc) -c $(src) $(CFLAGS) -L libcppdeque.a
#################################################
clean:
rm -rf $(prom) $(osrc) $(aprom)
20190108更新:
简单通用的Makefile .c编译成二进制文件(没有生成 .o 文件)
# Makefile
cc=gcc
LDFLAGS=-lncurses
SRCS := $(wildcard *.c)
TARGET := $(SRCS:%.c=%)
$(TARGET):$(SRCS)
$(cc) $(LDFLAGS) $(SRCS) -o $(TARGET)
clean:
rm $(TARGET)
参考链接:
https://blog.csdn.net/zhaocuit/article/details/74782789