编译可执行程序的Makefile模块
Posted 正在起飞的蜗牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译可执行程序的Makefile模块相关的知识,希望对你有一定的参考价值。
1、可执行程序的目录结构
demo/
├── bin #存放生成产物
├── include #依赖的头文件
├── lib #依赖的动态库
├── src #源文件、静态库
└── Makefile
2、编译可执行程序的Makefile模块
# 根据平台指定交叉编译工具链
ifeq ($(plat), x86)
CROSS = x86_64-4.8.5-linux-gnu-
else ifeq ($(plat),hi3516dv300)
CROSS = arm-himix200v002-linux-
endif
# 默认的交叉编译工具链
CROSS ?= x86_64-4.8.5-linux-gnu-
CROSS_COMPILE = $(CROSS)
# 定义交叉编译工具
CC = $(CROSS_COMPILE)gcc
CPP = $(CROSS_COMPILE)g++
AR = $(CROSS_COMPILE)ar
STRIP = $(CROSS_COMPILE)strip
RM = rm -fr
CP = cp -rf
# 根目录,也是当前目录
ROOT := $(shell pwd)
# 指定头文件路径
CFLAGS += -I$(ROOT)/include
CFLAGS += -I$(ROOT)/include/common
#编译选项
CFLAGS += -Wall -Werror -O2
CFLAGS += -g
CFLAGS += -c -o
#指定依赖库所在路径
LDFLAGS = -L$(ROOT)/lib
#链接所需库,假设依赖libosal.a
LDFLAGS += -losal
LDFLAGS += -lpthread
#查找所有src目录下.c源文件,只保留文件名不要路径
SRCS := $(wildcard $(ROOT)/src/*.c)
# 源文件.c后缀改为.o
OBJS := $(SRCS:%.c=%.o)
# 要生成的目标文件
TARGET = demo
$(TARGET): $(OBJS)
$(TARGET): $(OBJS)
$(CC) -o $@ $^ $(LDFLAGS) #生成可执行软件
cp $@ $(ROOT)/bin/$@_nostrip
$(STRIP) $@ # 生成strip版本
cp $@ $(ROOT)/bin/
clean:
-rm ./demo* ./src/*.o
# Makefile规则:将.c文件编译成.o
%.o : %.c
$(CC) $(CFLAGS) $@ $<
# Makefile规则:将.cpp文件编译成.o
%.o : %.cpp
$(CPP) $(CFLAGS) $@ $<
编译指令:make plat=xxx or make clean
以上是关于编译可执行程序的Makefile模块的主要内容,如果未能解决你的问题,请参考以下文章
编写编译规则文件Makefile,并通过make生成可执行文件