当前位置: 首页 > wzjs >正文

温州网站优化排名北京市朝阳区住房建设网站

温州网站优化排名,北京市朝阳区住房建设网站,用jsp做的网站需要什么工具栏,仿牌网站服务器1. 递归调用子目录 Makefile 通过 $(MAKE) -C 进入子目录并执行其 Makefile,这是最常见的分层构建方法。 示例:基本递归调用 目录结构: project/ ├── Makefile # 顶层 Makefile ├── lib/ │ ├── Makefile # 子目录…

1. 递归调用子目录 Makefile

通过 $(MAKE) -C 进入子目录并执行其 Makefile,这是最常见的分层构建方法。

示例:基本递归调用

目录结构:

project/
├── Makefile         # 顶层 Makefile
├── lib/
│   ├── Makefile     # 子目录 Makefile
│   └── src/
├── app/
│   ├── Makefile
│   └── src/
└── test/├── Makefile└── src/

顶层 Makefile 内容:

SUBDIRS = lib app test.PHONY: all clean $(SUBDIRS)all: $(SUBDIRS)$(SUBDIRS):$(MAKE) -C $@clean:for dir in $(SUBDIRS); do \$(MAKE) -C $$dir clean; \done

说明:

  • SUBDIRS 定义了所有子目录。

  • all 目标依赖 $(SUBDIRS),按顺序调用每个子目录的 make

  • clean 目标递归调用所有子目录的 clean 目标。


2. 处理子目录依赖关系

确保子目录按依赖顺序构建(例如 app 依赖 lib)。

示例:显式声明依赖
# 顶层 Makefile
SUBDIRS = lib app test# 定义依赖关系
app: lib
test: app.PHONY: all $(SUBDIRS)all: $(SUBDIRS)$(SUBDIRS):$(MAKE) -C $@

说明:

  • app: lib 表示构建 app 前必须先完成 lib 的构建。

  • 此时运行 make all 会按顺序执行:lib → app → test


3. 变量传递到子 Makefile

通过 export 或命令行将变量传递给子目录的 Makefile。

方法 1:全局导出变量
# 顶层 Makefile
export CFLAGS = -O2 -Wall
SUBDIRS = lib app testall: $(SUBDIRS)@echo "所有子目录构建完成"$(SUBDIRS):$(MAKE) -C $@

子目录 Makefile(例如 lib/Makefile):

# 直接使用上层导出的 CFLAGS
lib.o: src/lib.cgcc $(CFLAGS) -c src/lib.c -o lib.o
方法 2:命令行显式传递变量
# 顶层 Makefile
SUBDIRS = lib app testall: $(SUBDIRS)@echo "所有子目录构建完成"$(SUBDIRS):$(MAKE) -C $@ CFLAGS="$(CFLAGS)"

说明:

  • 子目录 Makefile 中,直接使用 $(CFLAGS)


4. 并行构建优化

利用 make -jN 启用并行构建,需确保依赖关系正确。

示例:允许无依赖子目录并行构建
SUBDIRS = lib utils app test# 定义依赖关系
app: lib utils
test: app.PHONY: all $(SUBDIRS)all: $(SUBDIRS)@echo "构建完成"$(SUBDIRS):$(MAKE) -C $@

运行命令:

make -j4  # 并行构建 lib、utils → 完成后构建 app → 最后构建 test

5. 错误处理

确保子目录构建失败时,上层 Makefile 立即终止。

示例:严格错误检查
# 顶层 Makefile
SUBDIRS = lib app test.PHONY: all $(SUBDIRS)all: $(SUBDIRS)@echo "构建成功"$(SUBDIRS):$(MAKE) -C $@ || exit 1clean:for dir in $(SUBDIRS); do \$(MAKE) -C $$dir clean || exit 1; \done

说明:

  • || exit 1 确保子目录构建失败时,整个流程立即终止


6. 多目标支持(如 clean、install)

通过变量动态传递目标名称,实现灵活的多目标调用。

示例:支持 install 和 distclean
# 顶层 Makefile
SUBDIRS = lib app test
TARGET = all  # 默认目标.PHONY: $(SUBDIRS) all install distcleanall: $(SUBDIRS)$(SUBDIRS):$(MAKE) -C $@ $(TARGET)install: TARGET = install
install: $(SUBDIRS)@echo "所有子目录安装完成"distclean: TARGET = distclean
distclean: $(SUBDIRS)@echo "彻底清理完成"

子目录 Makefile(示例 lib/Makefile):

.PHONY: all install distcleanall: lib.o@echo "lib 构建完成"install:cp lib.o /usr/local/lib  # 需要 sudo 权限的操作distclean:rm -f lib.o

运行命令:

make          # 构建所有子目录
make install  # 安装所有子目录(可能需要 sudo)
make distclean  # 彻底清理

7. 动态子目录发现

自动发现子目录,避免硬编码 SUBDIRS

示例:自动遍历子目录
# 顶层 Makefile
SUBDIRS := $(wildcard */.)  # 匹配所有子目录(例如 lib/. app/. test/.).PHONY: all $(SUBDIRS)all: $(SUBDIRS)@echo "构建完成"$(SUBDIRS):$(MAKE) -C $(@D)  # $(@D) 提取目录名(如 lib/. → lib)clean:for dir in $(SUBDIRS); do \$(MAKE) -C $$dir clean; \done

完整示例:分层构建项目

目录结构:
project/
├── Makefile
├── include/
│   └── common.h
├── lib/
│   ├── Makefile
│   └── src/
│       └── lib.c
├── app/
│   ├── Makefile
│   └── src/
│       └── app.c
└── test/├── Makefile└── src/└── test.c
顶层 Makefile:
export CFLAGS = -I../include -Wall -O2
SUBDIRS = lib app test.PHONY: all clean installall: $(SUBDIRS)@echo "=== 构建完成 ==="# 依赖关系
app: lib
test: app$(SUBDIRS):$(MAKE) -C $@clean:for dir in $(SUBDIRS); do \$(MAKE) -C $$dir clean; \doneinstall: all@echo "=== 安装到系统目录(需要 sudo)==="sudo cp app/bin/app /usr/local/binsudo cp lib/lib.so /usr/local/lib
子目录 Makefile(以 lib/Makefile 为例):
TARGET = lib.so
SRC = src/lib.c
OBJ = $(SRC:.c=.o).PHONY: all cleanall: $(TARGET)$(TARGET): $(OBJ)gcc -shared -o $@ $^%.o: %.cgcc $(CFLAGS) -fPIC -c $< -o $@clean:rm -f $(OBJ) $(TARGET)

关键总结

  1. 递归调用使用 $(MAKE) -C 进入子目录执行 Makefile。

  2. 依赖管理:通过目标依赖确保构建顺序(如 app: lib)。

  3. 变量传递export 或命令行显式传递编译选项。

  4. 并行构建:利用 make -jN 加速,但需正确声明依赖。

  5. 错误处理|| exit 1 确保子目录失败时终止。

  6. 多目标支持:通过变量动态传递目标名(如 installdistclean)。

  7. 动态子目录:使用 wildcard 自动发现子目录,避免硬编码。


文章转载自:

http://0HE4eoVg.jbmbj.cn
http://H20ejjxE.jbmbj.cn
http://eKyWF5T1.jbmbj.cn
http://LgFydyDQ.jbmbj.cn
http://hHCxzJGL.jbmbj.cn
http://mRDMWE7p.jbmbj.cn
http://rmiManaC.jbmbj.cn
http://Q5xzBkQc.jbmbj.cn
http://OoWsIh09.jbmbj.cn
http://lZyxE4WG.jbmbj.cn
http://cjQIlOet.jbmbj.cn
http://dgqrNolT.jbmbj.cn
http://FX9PLuhX.jbmbj.cn
http://cTjbcOKx.jbmbj.cn
http://xP4byYgt.jbmbj.cn
http://8zkMOkQ1.jbmbj.cn
http://1Zcrb0sD.jbmbj.cn
http://j4WC0BEN.jbmbj.cn
http://xQSg3peI.jbmbj.cn
http://Upp9zdoz.jbmbj.cn
http://AoVMtUs4.jbmbj.cn
http://pDRbmz7U.jbmbj.cn
http://k5XdwLb9.jbmbj.cn
http://J0thyf1K.jbmbj.cn
http://r6tqSmFd.jbmbj.cn
http://OheHX9LE.jbmbj.cn
http://yQ3klhVh.jbmbj.cn
http://MRCkjy5r.jbmbj.cn
http://bkDAdNpr.jbmbj.cn
http://SbjUIPU9.jbmbj.cn
http://www.dtcms.com/wzjs/761377.html

相关文章:

  • 网站如何做中英文双语言母婴类网站怎么建设
  • 如何做好网站宣传谷歌服务加速 wordpress
  • 流量最大的网站wordpress加载视频教程
  • wap网站编辑器做网站熊掌号
  • ps教学网站制作步骤wordpress按钮打开外部链接
  • 学网站建设难龙泉建设工程有限公司网站
  • 重庆企业网站设计制作乐清小程序
  • 郑州网站定制网页游戏排行大全
  • 在线生成app免费网站seo优化发布高质量外链
  • 自己电脑怎么做网站搜索引擎的优化方法有哪些
  • 如何查看网站的点击量广州最新新闻
  • 怎么在网上接网站建设做一个网站多久
  • 织梦网站上传及安装沈阳高端网站建设
  • 适合前端做项目的网站海口免费网站建设
  • 网站平台建设哪家公司好比较好看的网站设计
  • 怎么制作网站视频播放器555建筑人才网
  • 重庆企业做网站东莞营销网站建设价格
  • 网站内容栏目做网站优化两年遇到的SEO常态
  • 网站游戏网站建设上线了做的网站怎么办
  • 如何修改网站源文件网站兼容性代码
  • 做整体衣柜宣传海报的网站岚山区建设局网站
  • 铜陵app网站做招聘信息程序员培训课程
  • 陕西省建设监理协会官方网站网页游戏app排行榜
  • 网站售后服务模板王烨小说
  • 网站备案主体查询wordpress做微信推广
  • 爱站查询工具网页设计流程步骤
  • 菠菜网站怎么做推广比较好企业网站搭建流程
  • 长沙网站设惟博df1042可以看多远
  • 如何在建设银行网站查验回单wordpress php7 mysql
  • 绵阳网站关键词微信公众平台官网手机版