一点一点学写Makefile(2)-自动搜所当前目录下的所有源文件

上个博客我们使用的是笨方法添加源文件,本次我要实现的是遍历文件夹来获得所有的cpp文件


//makefile


CROSS = 
CC = $(CROSS)gcc
CXX = $(CROSS)g++
DEBUG = -g -O2
CFLAGS = $(DEBUG) -Wall -c
RM = rm -rf

SRCS = $(wildcard ./*.cpp)
OBJS = $(patsubst %.cpp, %.o, $(SRCS))

VERSION = 1.0.0.0
TARGET = test.$(VERSION)

$(TARGET) : $(OBJS)
	$(CXX) $^ -o $@

$(OBJS):%.o : %.cpp
	$(CXX) $(CFLAGS) $< -o $@


clean:
	$(RM) $(TARGET) *.o

 

 

第十一行功能:自动搜索指定目录下的所有cpp文件,如果没有指定,默认是当前目录,指定方法 - SRCS = $(wildcard ./src/*.cpp)

第十二行功能:通过cpp文件获得与之同名的*.o类型的文件

第二十行功能:将*.o文件和*.cpp文件想对应起来(这里会默认看成一个循环,即一个*.o和一个*.cpp文件均对应,直到所有的cpp文件和*.o文件都编译完成)

第二十四行,因为生成的目标文件包含版本信息,因此文件名不确定,建议使用$(TARGET)的形式,这是引用一个变量,在第十五行已有定义


下一节,我将会给大家讲,如何添加第三方库和第三方库所使用的头文件

############################################################################# # Makefile for building: sample 2011-09-26 # # Project: # Template: # Command: # ------基本上简单用法的makefile------- #1. 第一个目标为最终目标 #2. 命令以 Tab开头,可以有多个命令 #3. 分行号\ 后面不可以跟空格 #4、加@可以去掉命令显示 #5. 变量为 abc = efd 访问为 $(abc) echo $abc # # # #缺点,单文件夹 #每次都会重新生成 # #foo.o : foo.c defs.h # foo模块 #cc -c -g foo.c # #多目录 一种方法,在主目录里面include "",然后其里面OBJS += .o,这样其实就是 或用foreach ############################################################################# #target EXECUTABLE := test CC := gcc CXX := g++ STRIP := strip AR := ar cqs LINK := g++ RM := rm -f CFLAGS := -g -Wall CXXFLAGS := $(CFLAGS) CXXFLAGS += -MD LIBS := -lm LIBPATH := -L/usr/local/lib INCPATH := ####### Output directory OBJSPATH := ../Obj/ EXECUTABLEPATH := ../Execute/ #######source Files SOURCE := $(wildcard *.c) $(wildcard *.cpp) OBJS := $(patsubst %.c, %.o, $(patsubst %.cpp, %.o, $(SOURCE))) DEPS := $(patsubst %.o,%.d,$(OBJS)) #######rule .SUFFIXES: .cpp .c .o .so .a .d $(OBJSPATH)%.o:%.c $(CC) $(CFLAGS) -c $< -o $@ $(OBJSPATH)%.o:%.cpp $(CXX) $(CXXFLAGS) -c $< -o $@ $(OBJSPATH)%.d:%.cpp $(CXX) -MM $ $@ ######main .PHONY : all deps objs clean rebuild all: $(EXECUTABLE) $(CXX) $(CXXFLAGS) $(INCLUDEPATH) $(LIBS) $(LIBPATH) $(addprefix $(OBJSPATH),$(OBJS)) \ -o $(EXECUTABLEPATH)$(EXECUTABLE) deps: $(addprefix $(OBJSPATH),$(DEPS)) objs: $(addprefix $(OBJSPATH),$(OBJS)) clean: @$(RM) $(OBJSPATH)*.o @$(RM) $(OBJSPATH)*.d @$(RM) $(EXECUTABLEPATH)$(EXECUTABLE) rebuild: clean all -include $(addprefix $(OBJSPATH),$(DEPS)) ##.d里面是详细的.o rule 自己会括展开的,然后没有文件就自己去重建 $(EXECUTABLE) : objs
<think>好的,用户想习如何创建和使用Android项目的Makefile,需要教程。首先,我需要整理Android Makefile的基础知识,确保覆盖关键变量和规则。用户提供的引用中有关于LOCAL_PATH、LOCAL_MODULE、LOCAL_SRC_FILES等变量的说明,这些是必须包含的内容。 接下来,应该分步骤讲解编过程,从创建Android.mk文件开始,逐步添加模块定义、源文件、头文件路径等。需要提到如何指定编译平台,比如使用APP_ABI := armeabi-v7a,这一点在引用5中有提到,要强调适配性。 另外,用户提供的引用3提到了all-makefiles-under宏和调试方法,比如$(warning),这部分可以放在高级技巧里,帮助用户排查问题。还有引用4中的LOCAL_ASSET_FILES和LOCAL_C_INCLUDES,这些在配置资源文件和头文件时需要解释清楚。 可能需要检查是否有遗漏的重要变量或步骤,比如BUILD_SHARED_LIBRARY和BUILD_PACKAGE的区别,确保用户清楚不同模块类型的构建方式。同时,示例代码很重要,能够帮助用户更好地理解如何应用这些变量。 最后,生成相关问题时要围绕用户可能遇到的后续疑问,比如优化、多模块管理、调试方法等,确保覆盖用户可能的需求。需要确保所有信息准确,并正确引用提供的资料,比如引用2关于Makefile属性的解释。</think>### Android项目Makefile教程(基于NDK构建系统) #### 一、基础文件结构 1. 创建`Android.mk`文件 ``` # 设置当前模块路径(必须首行) LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # 清除旧变量 ``` 2. 定义模块类型 ```makefile # 编译动态库示例 LOCAL_MODULE := native-lib LOCAL_SRC_FILES := native-lib.cpp utils.cpp include $(BUILD_SHARED_LIBRARY) ``` #### 二、核心变量解析(引用[2][4]) 1. **LOCAL_MODULE** - 定义模块唯一标识(自动添加lib前缀) ```makefile LOCAL_MODULE := audio-decoder # 生成libaudio-decoder.so ``` 2. **LOCAL_SRC_FILES** - 指定源文件(支持C/C++/汇编) ```makefile LOCAL_SRC_FILES := \ src/decoder.cpp \ src/ffmpeg_wrapper.c ``` 3. **LOCAL_C_INCLUDES** - 添加头文件路径(引用[4]) ```makefile LOCAL_C_INCLUDES += \ $(LOCAL_PATH)/include \ external/zlib/include ``` #### 三、多模块配置 ```makefile # 第一个模块 include $(CLEAR_VARS) LOCAL_MODULE := module1 LOCAL_SRC_FILES := module1.cpp include $(BUILD_STATIC_LIBRARY) # 第二个模块(依赖模块1) include $(CLEAR_VARS) LOCAL_MODULE := module2 LOCAL_SRC_FILES := module2.cpp LOCAL_STATIC_LIBRARIES := module1 include $(BUILD_SHARED_LIBRARY) ``` #### 四、ABI配置(引用[5]) 在`Application.mk`中指定: ```makefile APP_ABI := armeabi-v7a arm64-v8a x86 APP_PLATFORM := android-21 ``` #### 五、调试技巧(引用[3]) 1. 输出变量值 ```makefile $(warning LOCAL_PATH value: $(LOCAL_PATH)) ``` 2. 错误中断 ```makefile $(if $(LOCAL_MODULE),,$(error LOCAL_MODULE not defined!)) ``` #### 六、完整示例(引用[1]) ```makefile LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := image-processor LOCAL_SRC_FILES := processor.cpp bitmap_utils.cpp LOCAL_C_INCLUDES += $(LOCAL_PATH)/libjpeg/include LOCAL_LDLIBS := -llog -ljnigraphics include $(BUILD_SHARED_LIBRARY) include $(call all-makefiles-under,$(LOCAL_PATH)) # 引用[3] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值