相关文章推荐
酒量大的充电器  ·  Controller action ...·  3 周前    · 
酒量大的充电器  ·  如何将 LINQ ...·  2 月前    · 
酒量大的充电器  ·  标注属性面板·  5 月前    · 
酒量大的充电器  ·  XML 与 HTML 对比 - ...·  8 月前    · 
酒量大的充电器  ·  Problem in login with ...·  9 月前    · 
威武的香瓜  ·  [转]Entity Framework ...·  4 小时前    · 

自动遍历子目录的通用Makefile

本文对文章 “一份通用makefile,自动遍历子目录源文件,自动生成依赖” 进行了些许修改,并根据自己使用情况修改一份适合编译*.c文件的,自测试可以使用。

这份makefile可以将当前makefile所在文件夹以及所有子文件夹中的cpp文件打包成静态库/动态库/可执行文件.
自动生成所有依赖关系,修改任何文件都可以触发重新编译相应依赖的文件。 在Ubuntu 和 OSX 系统测试通过。

SHELL = /bin/bash
AllDirs := $(shell ls -R | grep '^\./.*:$$' | awk '{gsub(":","");print}') .  
Sources := $(foreach n,$(AllDirs) , $(wildcard $(n)/*.cpp))  
Objs := $(patsubst %.cpp,%.o, $(Sources))  
Deps := $(patsubst %.cpp,%.d, $(Sources))  
StaticLib := libyy.a  
DynamicLib := libyy.so  
Bin := obj 
AllLibs : $(Bin) 
CC = gcc  
CXX = g++  
RM = rm -f  
#CXXFLAGS = -g -O2 -fPIC -Wall  
CXXFLAGS = -g -Wall  
CPPFLAGS = $(foreach n,$(AllDirs) , -I$(n))  
LDFLAGS = -lstdc++  
$(StaticLib) : $(Objs)  
    ar rcs $@ $^  
$(DynamicLib) : $(Objs)  
    $(CXX) -shared -o $@ $^ $(LDFLAGS)  
$(Bin) : $(Objs)  
    $(CXX) $(Objs) -o $@  
%.d : %.cpp  
    $(CXX) -MT"$(<:.cpp=.o) $@" -MM $(CXXFLAGS) $(CPPFLAGS) $< > $@  
sinclude $(Deps)  
clean:   
    $(RM) $(Objs) $(Deps) $(Bin)
.PHONY : clean  

其中:
$< :代表规则中通过目录搜索得到的依赖文件列表的第一个依赖文件。

$^: 代表所有通过目录搜索得到的依赖文件的完整路径名(目录 + 一般文件名)列表。

$@:代表规则的目标

使用时,输入make clean即可把make生成的中间文件(.o .d)和目标文件(obj)清除掉。

上述的Makefile适合于*.cpp文件的编译,为了使用C文件的编译对上面的Makefile进行稍微的修改,如下:

SHELL = /bin/bash
AllDirs := $(shell ls -R | grep '^\./.*:$$' | awk '{gsub(":","");print}') .  
Sources := $(foreach n,$(AllDirs) , $(wildcard $(n)/*.c))  
Objs := $(patsubst %.c,%.o, $(Sources))  
Deps := $(patsubst %.c,%.d, $(Sources))  
StaticLib := libyy.a
DynamicLib := libyy.so
Bin := obj
AllLibs : $(Bin)
CC = gcc
CXX = g++
RM = rm -f
CXXFLAGS = -g -Wall
CPPFLAGS = $(foreach n,$(AllDirs) , -I$(n))
LDFLAGS = -lstdc++
$(StaticLib) : $(Objs)
    ar rcs $@ $^
$(DynamicLib) : $(Objs)
    $(CC) -shared -o $@ $^ $(LDFLAGS)
$(Bin) : $(Objs)
    $(CC) $(Objs) -o $@
%.d : %.cpp
    $(CC) -MT"$(<:.c=.o) $@" -MM $(CXXFLAGS) $(CPPFLAGS) $< > $@
sinclude $(Deps)
clean: 
    $(RM) $(Objs) $(Deps) $(Bin)
.PHONY : clean

在执行Makefile时,有时候会出现missing separator的错误,通常的原因是tab格式导致的。makefile里只有命令所在的行才能且只能以TAB开头,make变量的定义、赋值,make内定函数如$(error “strings”)都不能以TAB开头,不然make会将其作为命令来处理!“makefile: * missing separator. Stop”

时候,我们在开发的时候需要将本次工程的代码分成多个子目录来编写,但是在Makefile的编写上却是个问题,下面我就教大家怎么构建带有子文件夹的源代码目录的自动扫描编译 下面这张图是我的文件树 这里面src目录下是我的源代码,我将功能代码分成了三个子模块,分别为test1, test2, test3, 调用这三个子模块的是main.cpp文件,下面我将这三个子模块的代码 [cp... python 移动文件利用python写一些简单的脚本整理程序,为生活服务是一个目标这个程序就是为了移动指定文件下的指定类型的文件到目标文件下# -*- coding: utf-8 -*-import osimport sysimport shutilprint 'move vedio into the sure folder'# set the file position where to ... 要对子目录执行make,需要在当前目录制作一个Makefile遍历所有子目录Makefile,并运行相应的make target. 以下是我用来编译内核模块的一个Makefile# # Reference http://www.gnu.org/software/make/manual/make.html ## 需要排除的目录 exclude_dirs := include AR=arLD=ldCC=gcc CFLAGS = -O2 -Wall -I./Test \ -I./Test/Test1 \ #注:"\"后面不能有空格,并且该句写完后最好有个换行 #注释部分推荐在单独的一行编写 #动态库... Makefile自动搜所目录及子目录下的的所有文件、自动生成编译目录,主要实现的功能入校描述: 1. myMath、myRecord、myString要分别能够单独生成各自对应的 .a 静态库文件 2. 将生成的 .a 文件统一放在根目录下 lib 专用文件夹中 3. myString 下要将以来的.a文件包含到生成的 .a 文件中 4. 文件的目录具有可扩展性,后续可随时添加文件或者文件夹 5. 在根目录下进行 make 同样生成上述三个 .a 文件到固定文件夹中 6. 在根目录下进行 make 需要将生成的这些 .a 文件和外部提供的其他的 .a 最终编译成一个可执行文件 7. 将最终生成的可执行文件放置在 bin 文件专用的文件夹中 原文链接:https://blog.csdn.net/songshuai0223/article/details/124676839 针对多文件夹makefile编写,可以写一个通用makefile遍历出每个文件夹,然后执行每个文件夹makefile,这样好处就是我们只需添加我们新增加的目录里面makefile,而不必理会之前的文件夹结构,非常方便。 1.首先遍历当前目录SRC_PATH下文件夹 SRC_FOLDER := $(shell find $(SRC_PATH) -maxdepth 1 -type d) BA... 这份makefile可以将当前makefile所在文件夹以及所有子文件夹中的cpp文件打包成静态库/动态库/可执行文件. 自动生成所有依赖关系,修改任何文件都可以触发重新编译相应依赖的文件。 在Ubuntu 和 OSX 系统测试通过。 这份makefile可以将当前makefile所在文件夹以及所有子文件夹中的cpp文件打包成静态库/动态库/可执行文件. 自动生成所有依赖关系,修改任何 最近写的小项目文件越来越多,也加了一些子目录,就增加了子目录makefile,总结了一种写法分享给小伙伴先看效果, 有几个目录common,drv,main,执行主目录makefile,会逐个进入这几个子目录调用子目录makefile进行编译,clean的时候也是进入子目录进行make clean。主目录makefile内容:###进入子目录make,编译指定的.c文件为.o文件 target=load_main export c1:= export INCDIRS:=common drv SRCDIR 一、关于Makefile的一些Tips 1. 整个Makefile是按照“依赖关系树”来执行的,Makefile中的所有依赖根据各种规则定义出来,Makefile识别这些规则,并建立一个树状的依赖关系数据结构,并根据该数据结构的指导,有序地进行各项操作,从“依赖关系树”的各个叶子节点汇集到根节点,即Makefile的最终target,Build出target。这里的“依赖关系”实际上就是用了 首先说说本次嵌套执行makefile文件的目的:只需make根目录下的makefile文件,即可编译所有c文件,包括子目录下的。 意义:自动化编译行为,以后编译自己的c文件时可把这些makefile文件直接复制到相应目录即可方便编译出所有文件。这些makefile文件是通用的,只需根据自己的工程情况改动少许内容即可。下面会说。 总体思路是:把目标文件放在debug文件夹下的obj目录下,把最终...
 
推荐文章