网站栏目及内容移动端布局

张小明 2026/1/13 8:38:35
网站栏目及内容,移动端布局,京东网站开发费用,网址站长之家第七章#xff1a;Makefile多目录项目 - 组织大型项目结构 7.1 为什么需要多目录#xff1f; 小项目 vs 大项目 小项目#xff08;单目录#xff09; 大项目#xff08;多目录#xff09; ├── main.c ├── src/ ├── utils.c │…第七章Makefile多目录项目 - 组织大型项目结构7.1 为什么需要多目录小项目 vs 大项目小项目单目录 大项目多目录 ├── main.c ├── src/ ├── utils.c │ ├── main.c ├── config.h │ ├── app/ └── Makefile │ │ ├── ui.c │ │ └── logic.c │ └── lib/ │ ├── math.c │ └── net.c ├── include/ │ ├── app/ │ └── lib/ ├── build/ ├── bin/ └── Makefile问题文件太多混在一起难以管理7.2 标准项目结构推荐结构myproject/ ├── src/ # 源代码 │ ├── main.c │ ├── module1/ │ └── module2/ ├── include/ # 头文件 │ ├── module1/ │ └── module2/ ├── lib/ # 第三方库 ├── build/ # 编译中间文件 ├── bin/ # 最终可执行文件 ├── tests/ # 测试代码 └── Makefile # 根Makefile7.3 核心技巧递归Makefile方法1递归调用传统方法# 根目录Makefile SUBDIRS src lib tests all: for dir in $(SUBDIRS); do \ $(MAKE) -C $$dir; \ done clean: for dir in $(SUBDIRS); do \ $(MAKE) -C $$dir clean; \ done方法2非递归推荐# 收集所有源文件 SRC_DIRS src src/module1 src/module2 SRCS $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.c)) # 生成对应的目标文件 OBJS $(patsubst %.c,build/%.o,$(SRCS))7.4 完整实战非递归Makefile项目结构calculator/ ├── src/ │ ├── main.c │ ├── math/ │ │ ├── add.c │ │ └── mul.c │ └── ui/ │ └── display.c ├── include/ │ ├── math/ │ │ ├── add.h │ │ └── mul.h │ └── ui/ │ └── display.h └── Makefile源代码示例src/main.c#includestdio.h#includemath/add.h#includeui/display.hintmain(){intsumadd(5,3);display_result(sum);return0;}include/math/add.h#ifndefADD_H#defineADD_Hintadd(inta,intb);#endifMakefile实现# 配置 CC gcc CFLAGS -Wall -O2 TARGET bin/calculator # 目录定义 SRC_DIR src INC_DIR include BUILD_DIR build BIN_DIR bin # 自动发现文件 # 1. 找到所有源文件递归查找 SRCS $(shell find $(SRC_DIR) -name *.c) # 2. 找到所有头文件 INCS $(shell find $(INC_DIR) -name *.h) # 3. 生成目标文件路径 # src/main.c - build/src/main.o OBJS $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.o,$(SRCS)) # 4. 生成依赖文件 DEPS $(OBJS:.o.d) # 包含路径 # 自动添加所有包含目录 INC_DIRS $(shell find $(INC_DIR) -type d) INC_FLAGS $(addprefix -I,$(INC_DIRS)) # 创建目录 $(shell mkdir -p $(BUILD_DIR) $(BIN_DIR) \ $(dir $(OBJS)) $(dir $(DEPS))) # 构建规则 all: $(TARGET) $(TARGET): $(OBJS) echo 链接目标文件... $(CC) $^ -o $ echo ✅ 构建完成: $ echo 文件: $(words $(SRCS))个源文件, $(words $(OBJS))个目标文件 # 核心编译并生成依赖 $(BUILD_DIR)/%.o: $(SRC_DIR)/%.c echo 编译: $ $(CC) $(CFLAGS) $(INC_FLAGS) -MMD -MP -c $ -o $ # 包含依赖文件 -include $(DEPS) # 工具目标 clean: echo 清理构建文件... rm -rf $(BUILD_DIR) $(BIN_DIR) info: echo 项目信息 echo 目标程序: $(TARGET) echo 源文件目录: $(SRC_DIR) echo 头文件目录: $(INC_DIR) echo 构建目录: $(BUILD_DIR) echo 输出目录: $(BIN_DIR) echo echo 源文件 ($(words $(SRCS)) 个): for f in $(SRCS); do echo $$f; done echo echo 头文件 ($(words $(INCS)) 个): for f in $(INCS); do echo $$f; done echo echo 包含目录: for d in $(INC_DIRS); do echo -I$$d; done dirs: echo 创建目录结构... mkdir -p src/{math,ui} mkdir -p include/{math,ui} mkdir -p build bin tree . .PHONY: all clean info dirs7.5 模块化管理子模块Makefile当项目特别大时可以分模块目录结构large_project/ ├── Makefile # 根Makefile ├── src/ │ ├── Makefile # 主程序模块 │ └── main.c ├── lib/ │ ├── Makefile # 库模块 │ ├── math.c │ └── net.c └── tests/ └── Makefile # 测试模块根目录Makefile# 根Makefile - 协调各模块 export CC gcc export CFLAGS -Wall -O2 SUBDIRS lib src tests .PHONY: all clean $(SUBDIRS) all: $(SUBDIRS) $(SUBDIRS): echo 构建模块: $ $(MAKE) -C $ clean: for dir in $(SUBDIRS); do \ echo 清理模块: $$dir; \ $(MAKE) -C $$dir clean; \ done rm -rf build bin # 显示帮助 help: echo 可用命令: echo make # 构建所有模块 echo make lib # 只构建lib模块 echo make src # 只构建src模块 echo make tests # 只构建tests模块 echo make clean # 清理所有模块lib模块的Makefile# lib/Makefile SRCS math.c net.c OBJS $(SRCS:.c.o) LIB libmylib.a # 构建静态库 $(LIB): $(OBJS) ar rcs $ $^ echo ✅ 库构建完成: $ %.o: %.c $(CC) $(CFLAGS) -I../include -c $ -o $ clean: rm -f $(OBJS) $(LIB) .PHONY: clean7.6 处理第三方库# 第三方库配置 THIRD_PARTY_DIR lib/thirdparty THIRD_PARTY_INC $(THIRD_PARTY_DIR)/include THIRD_PARTY_LIB $(THIRD_PARTY_DIR)/lib # 检查需要的库 CHECK_LIBJSON $(shell pkg-config --exists json-c 2/dev/null echo yes) ifeq ($(CHECK_LIBJSON),yes) # 使用系统库 JSON_CFLAGS $(shell pkg-config --cflags json-c) JSON_LIBS $(shell pkg-config --libs json-c) $(info ✅ 使用系统json-c库) else # 使用内置库 JSON_CFLAGS -I$(THIRD_PARTY_INC)/json JSON_LIBS -L$(THIRD_PARTY_LIB) -ljson $(info 使用内置json库) endif # 合并到编译选项 CFLAGS $(JSON_CFLAGS) LIBS $(JSON_LIBS)7.7 高级技巧VPATH指令# 告诉make在这些目录中查找源文件 VPATH src:src/math:src/ui # 现在可以这样写规则 %.o: %.c $(CC) $(CFLAGS) -c $ -o $ # make会自动在VPATH指定的目录中寻找.c文件7.8 完整生产环境示例# # 生产环境多目录项目Makefile # # ---------- 基本配置 ---------- PROJECT myapp VERSION 1.0.0 CC gcc CFLAGS -Wall -O2 -DVERSION\$(VERSION)\ LDFLAGS # ---------- 目录结构 ---------- SRC_ROOT src INC_ROOT include BUILD_ROOT build BIN_ROOT bin LIB_ROOT lib # 模块定义 MODULES core utils network ui # ---------- 自动文件发现 ---------- # 源文件所有模块 SRC_DIRS $(SRC_ROOT) $(addprefix $(SRC_ROOT)/,$(MODULES)) SRCS $(foreach dir,$(SRC_DIRS),$(wildcard $(dir)/*.c)) # 头文件 INC_DIRS $(INC_ROOT) $(addprefix $(INC_ROOT)/,$(MODULES)) # 生成构建路径 OBJS $(patsubst $(SRC_ROOT)/%.c,$(BUILD_ROOT)/%.o,$(SRCS)) DEPS $(OBJS:.o.d) # ---------- 包含路径 ---------- INC_FLAGS $(addprefix -I,$(INC_DIRS)) CFLAGS $(INC_FLAGS) # ---------- 最终目标 ---------- TARGET $(BIN_ROOT)/$(PROJECT) # ---------- 自动创建目录 ---------- MAKE_DIRS $(BIN_ROOT) $(BUILD_ROOT) \ $(sort $(dir $(OBJS))) $(sort $(dir $(DEPS))) $(shell mkdir -p $(MAKE_DIRS)) # ---------- 构建规则 ---------- .PHONY: all clean info help all: $(TARGET) $(TARGET): $(OBJS) echo [LD] 链接 $(words $(OBJS)) 个目标文件 $(CC) $(OBJS) $(LDFLAGS) -o $ echo ✅ $(PROJECT) v$(VERSION) 构建完成 echo 位置: $(TARGET) # 编译规则自动依赖生成 $(BUILD_ROOT)/%.o: $(SRC_ROOT)/%.c echo [CC] $ mkdir -p $(dir $) $(CC) $(CFLAGS) -MMD -MP -c $ -o $ # 包含依赖 -include $(DEPS) # ---------- 模块单独构建 ---------- define MODULE_TEMPLATE $(1): echo 构建模块: $(1) OBJS_FILTERED$$(filter $(BUILD_ROOT)/$(1)/%,$(OBJS)); \ if [ -n $$OBJS_FILTERED ]; then \ for obj in $$OBJS_FILTERED; do \ src$$(patsubst $(BUILD_ROOT)/%.o,$(SRC_ROOT)/%.c,$$obj); \ $(CC) $(CFLAGS) -MMD -MP -c $$src -o $$obj; \ echo [CC] $$src; \ done; \ else \ echo ⚠️ 模块 $(1) 没有源文件; \ fi endef # 为每个模块生成目标 $(foreach mod,$(MODULES),$(eval $(call MODULE_TEMPLATE,$(mod)))) # ---------- 清理 ---------- clean: echo 清理构建文件... rm -rf $(BUILD_ROOT) $(BIN_ROOT) echo ✅ 清理完成 # ---------- 信息显示 ---------- info: echo $(PROJECT) v$(VERSION) echo 编译器: $(CC) echo 模块: $(MODULES) echo 源文件: $(words $(SRCS)) 个 echo 头文件目录: $(words $(INC_DIRS)) 个 echo 包含路径: for dir in $(INC_DIRS); do echo $$dir; done # ---------- 安装 ---------- PREFIX ? /usr/local install: $(TARGET) echo 安装到 $(PREFIX)/bin install -d $(PREFIX)/bin install -m 755 $(TARGET) $(PREFIX)/bin/ echo ✅ 安装完成 # ---------- 打包 ---------- dist: clean echo 打包项目... tar -czf $(PROJECT)-$(VERSION).tar.gz \ --excludebuild \ --excludebin \ --exclude*.tar.gz \ . echo ✅ 打包完成: $(PROJECT)-$(VERSION).tar.gz # ---------- 帮助 ---------- help: echo 可用命令: echo make # 构建整个项目 echo make clean # 清理构建文件 echo make info # 显示项目信息 echo make install # 安装到系统 echo make dist # 打包发布 echo echo 模块构建: for mod in $(MODULES); do echo make $$mod; done7.9 使用示例# 1. 查看项目结构makeinfo# 2. 构建整个项目make# 3. 只构建某个模块如果定义了模块目标makecore# 4. 清理makeclean# 5. 安装sudomakeinstall# 6. 打包发布makedist7.10 常见问题问题1找不到头文件# ❌ 错误 CFLAGS -Iinclude # ✅ 正确递归包含 INC_DIRS $(shell find include -type d) INC_FLAGS $(addprefix -I,$(INC_DIRS)) CFLAGS $(INC_FLAGS)问题2目录不存在# 在编译规则中创建目录 $(BUILD_DIR)/%.o: $(SRC_DIR)/%.c mkdir -p $(dir $) # 先创建目录 $(CC) $(CFLAGS) -c $ -o $问题3清理不彻底# 清理所有生成的目录 clean: rm -rf build bin7.11 最佳实践总结目录结构规则src/ - 只放源文件include/ - 只放头文件build/ - 编译中间文件bin/ - 最终可执行文件lib/ - 第三方库Makefile编写原则自动发现文件用find或wildcard自动创建目录用mkdir -p自动生成依赖用-MMD -MP模块化设计大项目分模块清晰提示显示当前操作核心命令# 1. 找到所有源文件 SRCS $(shell find src -name *.c) # 2. 生成目标文件路径 OBJS $(patsubst src/%.c,build/%.o,$(SRCS)) # 3. 自动创建目录 $(shell mkdir -p $(sort $(dir $(OBJS))))一句话原则让目录结构组织代码让Makefile自动发现代码下一章预告第八章Makefile高级技巧 - 自动化测试与发布项目结构组织好了如何自动化测试和发布下一章教你用Makefile实现持续集成小测验现有结构proj/ ├── src/ │ ├── main.c │ └── lib/ │ ├── a.c │ └── b.c ├── include/ │ └── lib/ └── build/写一个Makefile要求自动找到所有.c文件在build目录保持同样结构正确设置包含路径答案SRCS $(shell find src -name *.c) OBJS $(patsubst src/%.c,build/%.o,$(SRCS)) INC_DIRS $(shell find include -type d) INC_FLAGS $(addprefix -I,$(INC_DIRS)) $(shell mkdir -p $(dir $(OBJS))) build/%.o: src/%.c mkdir -p $(dir $) $(CC) -c $ $(INC_FLAGS) -o $ app: $(OBJS) $(CC) $^ -o $
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

江苏建设人才网站自考大专报名官网入口

SSH Agent转发提升TensorFlow远程开发体验 在深度学习项目中,工程师常常需要连接远程GPU服务器进行模型训练。一个典型的场景是:你正用笔记本电脑通过SSH登录到一台搭载A100显卡的TensorFlow服务器,在Jupyter Notebook里编写代码时&#xff0…

张小明 2026/1/9 9:31:09 网站建设

旅游预定型网站建设导航网站 cms

FaceFusion动态视频处理稳定性实测报告 在短视频与直播内容爆发式增长的今天,AI驱动的人脸替换技术正以前所未有的速度渗透进影视制作、虚拟主播乃至社交娱乐场景。然而,大多数开源换脸工具仍停留在“能用”阶段——画面闪烁、身份漂移、边缘生硬等问题频…

张小明 2026/1/9 21:59:55 网站建设

网站申请免费定制企业网站建设

MATLAB代码:基于多目标遗传算法的分布式电源选址定容研究 关键词:分布式电源 选址定容 多目标遗传算法 参考文档:《店主自写文档》基本复现; 仿真平台:MATLAB 主要内容:代码主要做的是基于多目标遗传算…

张小明 2026/1/9 14:00:42 网站建设

南昌seo网站建设公司外贸网站

演唱会门票一票难求,黄牛高价倒卖让人望而却步。现在,通过Python自动化技术,你可以拥有自己的智能抢票专家,轻松获取心仪演出的入场券。 【免费下载链接】DamaiHelper 大麦网演唱会演出抢票脚本。 项目地址: https://gitcode.co…

张小明 2026/1/9 19:47:44 网站建设

淄博网站建设公司有几家江西住房和城乡建设厅网站首页

看短剧有收益,解锁休闲生活新方式在快节奏的现代生活中,如何高效利用碎片化时间进行娱乐与放松,已成为大众普遍关注的话题。近年来,短剧以其“短平快”、强情节的特点迅速崛起,成为休闲娱乐市场的一股新势力。对于广大…

张小明 2026/1/9 11:55:16 网站建设

网站源码小千个人网wordpress建站是什么意思

工作流项目开发:从关联配置到扩展实现的全面指南 1. 关联初始化与配置 在工作流项目中,关联是一个重要的概念。XPath 查询在关联初始化时可能显得有些晦涩,但 Visual Studio 会为我们处理这些细节。我们只需从下拉菜单中选择合适的属性即可,该下拉菜单会列出传入消息中的…

张小明 2026/1/9 7:33:02 网站建设