我的第一个makefile

本文介绍了一个具体的Makefile示例,详细展示了如何通过Makefile来管理项目的编译过程,包括依赖文件的设定、编译规则及清理操作等。文章强调了在使用gcc命令时必须使用TAB键而非空格的重要性。

  objects = main.o fun1.o fun2.o
  edit: $(objects)
    gcc -lpthread -o edit $(objects)
   fun1.o: fun1.c
    cc -c fun1.c
   fun2.o: fun2.c
    cc -c fun2.c
  clean:
    rm edit $(objects)

 

注意的地方: gcc语句必须用TAB键,不能用空格,否则会提示makefile 3:***遗漏分割符

源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引一波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第一次运行时会自动生产一个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另一种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得类似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函数版(推荐! ) 下载项目源码和压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 一定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函数官网 选择函数服务-新建-自定义创建 函数名称随意-地区随意-运行环境Python3....
<think>嗯,用户现在想了解是否需要自己编写Makefile以及如何编写自定义的Makefile。根据用户提供的引用内容,他们可能已经接触过一些基本的Makefile结构,比如包含库、路径管理、生成中间文件等。首先,我需要确认用户的实际需求是什么。他们可能是在开发一个C/C++项目,需要自动化构建过程,但不确定是否需要从头编写Makefile,或者如何优化现有的。 用户之前的问题是关于Bear工具与Makefile的集成,现在转向如何编写Makefile本身,说明他们可能在项目构建过程中遇到了问题,或者想要更深入地理解Makefile的结构。用户提供的引用中有提到自定义静态库、目录结构、头文件包含以及编译规则,这些都是编写Makefile的关键部分。 首先,是否需要自己编写Makefile取决于项目复杂度。如果项目简单,使用现有的工具或生成器(如CMake)可能更方便。但对于定制化需求,比如特定目录结构、自定义库或优化编译选项,手动编写Makefile更灵活。 接下来,用户需要知道如何编写自定义的Makefile。根据引用内容,用户的项目可能包含多个目录,如src、inc、obj、build等,需要处理头文件包含、静态库链接、中间文件生成。此外,用户可能遇到多级Makefile或递归make的问题,这在之前的回答中也有涉及。 我需要考虑用户可能的目录结构,并给出一个结构清晰的示例。比如,src存放源代码,inc头文件,obj中间文件,build生成的可执行文件,opensource存放第三方库。然后,逐步构建Makefile的变量定义、目标规则、自动依赖处理等。 另外,用户提到的引用3中提到,如果目标文件未修改,make不会重新编译,这说明用户可能对make的依赖检查和增量编译有疑问。需要解释.PHONY目标、clean规则,以及如何确保依赖关系正确,比如使用gcc -MM生成依赖文件。 用户可能还关心如何处理多目录结构,比如递归make或使用VPATH变量。或者如何链接自定义静态库,这在引用2中提到。需要展示如何添加库路径和链接库。 还需要注意常见问题,比如并行编译(-j选项)、路径处理、跨平台兼容性等,这些在之前的回答中也有涉及,需要保持一致性。 最后,用户可能需要知道如何优化Makefile,比如减少重复代码,使用模式规则,自动化依赖生成,以提高维护性和可扩展性。同时,结合Bear工具生成compile_commands.json,方便后续工具链使用。 总结,回答需要分步骤,从目录结构开始,逐步讲解变量定义、编译规则、自动依赖、多目标处理、清理规则,并提供完整示例。同时,解答常见问题,确保用户能实际应用并避免常见陷阱。</think>### 自定义Makefile编写指南 --- #### 一、是否需要自己编写Makefile? 需要编写自定义Makefile的场景: 1. **定制化编译流程**:需要控制编译顺序、特殊预处理等 2. **复杂目录结构**:项目包含`src/`, `inc/`, `lib/`等多级目录[^2] 3. **第三方库集成**:需要链接自定义静态库或动态库[^2] 4. **交叉编译需求**:针对不同架构定制编译工具链 --- #### 二、基础Makefile结构(以C/C++项目为例) **项目目录结构**: ``` project/ ├── build/ # 最终可执行文件(ELF/binary) ├── obj/ # 中间目标文件(.o) ├── src/ # 源代码(.c/.cpp) ├── inc/ # 头文件(.h) └── opensource/ # 第三方库文件[^2] ``` **基础模板**: ```makefile # 编译器配置 CC = gcc CXX = g++ CFLAGS = -I./inc -Wall -Wextra LDFLAGS = -L./opensource -lmylib # 文件路径配置 SRC_DIR = src OBJ_DIR = obj BUILD_DIR = build # 自动获取源文件列表 SOURCES = $(wildcard $(SRC_DIR)/*.c) OBJECTS = $(patsubst $(SRC_DIR)/%.c,$(OBJ_DIR)/%.o,$(SOURCES)) TARGET = $(BUILD_DIR)/myapp # 主规则 all: $(TARGET) # 链接规则 $(TARGET): $(OBJECTS) @mkdir -p $(BUILD_DIR) $(CC) $^ -o $@ $(LDFLAGS) # 编译规则 $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c @mkdir -p $(OBJ_DIR) $(CC) $(CFLAGS) -c $< -o $@ # 清理规则 clean: rm -rf $(OBJ_DIR) $(BUILD_DIR) .PHONY: all clean ``` --- #### 三、关键组件详解 **1. 变量定义**: ```makefile # 编译器选择 CXX_STD = c++17 CXXFLAGS = -I$(INC_DIR) -std=$(CXX_STD) -O2 # 静态库配置 STATIC_LIBS = $(wildcard opensource/*.a) LDFLAGS += $(STATIC_LIBS) ``` **2. 自动依赖生成**(解决头文件修改触发重新编译): ```makefile DEP_DIR = .deps DEPFLAGS = -MT $@ -MMD -MP -MF $(DEP_DIR)/$*.d COMPILE.c = $(CC) $(DEPFLAGS) $(CFLAGS) -c COMPILE.cpp = $(CXX) $(DEPFLAGS) $(CXXFLAGS) -c $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c @mkdir -p $(DEP_DIR) $(OBJ_DIR) $(COMPILE.c) $< -o $@ # 包含依赖文件 -include $(wildcard $(DEP_DIR)/*.d) ``` **3. 多目标构建**: ```makefile # 定义多个可执行文件 TARGETS = $(BUILD_DIR)/server $(BUILD_DIR)/client all: $(TARGETS) $(BUILD_DIR)/server: $(OBJ_DIR)/server.o $(OBJ_DIR)/common.o $(CXX) $^ -o $@ $(LDFLAGS) $(BUILD_DIR)/client: $(OBJ_DIR)/client.o $(OBJ_DIR)/common.o $(CXX) $^ -o $@ $(LDFLAGS) ``` --- #### 四、进阶技巧 **1. 条件编译**: ```makefile # 根据DEBUG变量切换编译模式 ifeq ($(DEBUG),1) CFLAGS += -g -DDEBUG else CFLAGS += -O3 endif ``` **2. 第三方库支持**: ```makefile # OpenSSL库支持示例 OPENSSL_DIR = /usr/local/opt/openssl CFLAGS += -I$(OPENSSL_DIR)/include LDFLAGS += -L$(OPENSSL_DIR)/lib -lssl -lcrypto ``` **3. 跨平台支持**: ```makefile # 检测Windows系统 ifeq ($(OS),Windows_NT) RM = del /Q MKDIR = mkdir else RM = rm -rf MKDIR = mkdir -p endif ``` --- #### 五、完整示例(支持C++17标准) ```makefile # 基础配置 CXX = g++ CXX_STD = c++17 INC_DIR = inc SRC_DIR = src BUILD_DIR = build TARGET = $(BUILD_DIR)/app # 自动发现源文件 SOURCES = $(wildcard $(SRC_DIR)/*.cpp) OBJECTS = $(patsubst $(SRC_DIR)/%.cpp,$(BUILD_DIR)/%.o,$(SOURCES)) # 编译选项 CXXFLAGS = -I$(INC_DIR) -std=$(CXX_STD) -Wall -Wextra LDFLAGS = -pthread # 主规则 all: $(TARGET) $(TARGET): $(OBJECTS) $(CXX) $^ -o $@ $(LDFLAGS) $(BUILD_DIR)/%.o: $(SRC_DIR)/%.cpp @mkdir -p $(BUILD_DIR) $(CXX) $(CXXFLAGS) -c $< -o $@ clean: rm -rf $(BUILD_DIR) .PHONY: all clean ``` --- #### 六、常见问题解决方案 | 问题现象 | 解决方案 | |---------------------------|-------------------------------------------------------------------------| | **头文件修改不触发重新编译** | 实现自动依赖生成(见第三部分第2小节) | | **链接顺序导致符号丢失** | 调整库链接顺序:被依赖的库放在后面,例如`-lmylib -lzlib` | | **多目录结构支持** | 使用`vpath`指令或`$(wildcard dir/*.c)`[^3] | | **并行编译错误** | 添加`.NOTPARALLEL:`声明或使用`-j`参数控制并行度 | --- ### 相关问题 1. 如何通过Makefile实现跨平台编译(Windows/Linux/macOS)? 2.Makefile中如何处理动态库的版本控制? 3. 如何将Bear工具与自定义Makefile结合生成编译数据库? [^1]: Makefile变量作用域规范 : 静态库链接顺序原理 [^3]: GNU make手册vpath用法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值