本地makefile 编译其他文件夹文件 指定obj目录

这个博客详细介绍了如何使用Makefile来构建一个名为'car'的嵌入式系统库。内容包括定义变量如PRJ_HOME、PRJ、VERSION等,设置目录路径,指定源文件和目标文件,以及编译和链接过程。Makefile中包含了编译选项,例如-Os用于优化大小,-ggdb用于调试,-I用于包含头文件路径。此外,还展示了Makefile的执行步骤,如创建目标目录、编译源文件和生成静态库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PRJ_HOME := $(shell pwd)
PRJ := car
VERSION := 1.0.0.0
NAME_LIB := libu.a


DIR_LIB := $(PRJ_HOME)/lib
DIR_OBJ := $(PRJ_HOME)/obj
DIR_INC_CUR_BPS := $(PRJ_HOME)/bpslib
DIR_INC_CUR := ./

DIR_UI := $(PRJ_HOME)/../MDS
DIR_UI_API := $(DIR_UI)/api
DIR_UI_LOG := $(DIR_UI)/log
 

DIR_INC_SUBS :=  -I$(DIR_UI_API) -I$(DIR_UI_LOG)/native  -I$(DIR_UI)/interface


SRCS := $(DIR_UI_API)/api_call.o \
    $(DIR_UI_API)/api_common.o \   
    $(DIR_UI_API)/empty_fun.o \
    $(DIR_UI_LOG)/native/log.o \

$(info $(PRJ_HOME))
$(info $(DIR_UI))
$(info $(SRCS))
$(info "debug info---------------1----------")
    #echo "debug info---------------1e-------------------"
CC    = arm-none-linux-gnueabi-gcc
AR     = arm-none-linux-gnueabi-ar
RANLIB = arm-none-linux-gnueabi-ranlib
MAKE := make --no-print-directory
CPPFLAGS = -Os -ggdb -c -Wall -DLINUX -I$(DIR_INC_CUR) -I$(DIR_INC_CUR_BPS) $(DIR_INC_SUBS)
CFLAGS += -D QT_CAR2

SRCS_NAME := $(notdir $(SRCS))
#OBJS = $(SRCS_NAME:%.o=$(DIR_OBJ)/%.o)
OBJS := $(addprefix $(DIR_OBJ)/,$(SRCS_NAME))
$(info $(SRCS_NAME))
$(info $(OBJS))

$(info "debug info---------------2----------")
    #echo  "debug info--------------2e-------------------"

TARGET = $(DIR_LIB)/$(NAME_LIB)
all: $(DIR_OBJ) $(DIR_LIB) $(TARGET)
    $(info "debug info------3-------------------")
    @echo  "debug info------3e-------------------"    
$(DIR_OBJ):
    @test -d $@ || mkdir $@
$(DIR_LIB):
    @test -d $@ || mkdir $@
%.o: %.c
    $(info "--------------4--here add the debug info")    
    #@echo "--------------4--here add the debug info"
    $(CC) $(CFLAGS) $(CPPFLAGS) -o $(DIR_OBJ)/$(notdir $@) $<
    $(info "--------------4e--here add the debug info")
    #@echo "--------------4e--here add the debug info")
    
$(TARGET): $(SRCS) 
    $(info "debug info------5-------------------")
    @echo  "debug info------5e-------------------"
    $(AR) rv $(TARGET) $(OBJS)
    $(RANLIB) $(TARGET)
    $(info "debug info------6-------------------")
    @echo  "debug info------6e-------------------"
    
    cp ./lib/libu.a ../qt
    $(info "debug info------7-------------------")
    @echo  "debug info------7e-------------------"
clean:
    @rm -rf $(DIR_LIB)
    @rm -rf $(DIR_OBJ)
    $(info "debug info------clean-------------------")
    @echo  "debug info------clean  e-------------------"
 

<think>好的,用户现在遇到了Makefile无法指定输出文件夹的问题。首先,我需要回想一下Makefile的基本结构和常见用法。Makefile默认情况下会在当前目录下生成目标文件,但用户可能希望将输出文件放到特定目录中,比如build或者bin目录。这时候,用户可能会遇到路径不存在或者规则中没有正确指定输出路径的问题。 接下来,我需要考虑用户可能的错误场景。例如,用户可能直接在规则中指定了输出路径,但忘记创建该目录,导致“No such file or directory”错误。或者,用户可能没有在规则中正确使用变量来指定输出路径,导致生成的文件仍然在当前目录。 然后,我应该思考解决方案。首先,需要确保输出目录存在,可以在Makefile中添加一条规则来创建目录,比如使用mkdir -p命令。其次,需要在编译命令中指定输出路径,例如使用gcc的-o选项将目标文件输出到指定目录。另外,可能需要使用自动化变量和模式规则来处理多个文件的情况,避免重复编写规则。 还需要考虑变量定义的问题,比如定义OUT_DIR变量,并在整个Makefile中引用它,这样方便用户修改输出路径。同时,要提醒用户在clean规则中也要处理输出目录中的文件,避免残留旧文件。 可能用户没有意识到Makefile中的路径处理需要显式指定,特别是在多目录项目中。因此,给出具体的示例会比较有帮助,比如展示如何修改规则中的命令,添加目录创建步骤,以及如何正确使用变量。 另外,用户可能需要了解如何保持源码目录的整洁,将生成的文件与源代码分离,这是良好的项目管理实践。可以建议用户使用通用的构建目录结构,如build或bin,并说明如何自动创建这些目录。 还要注意Makefile中的依赖关系,确保在构建目标之前先创建输出目录。可能需要将目录创建作为目标的依赖项,或者使用order-only前置条件,避免不必要的重新构建。 最后,检查常见的陷阱,比如忘记在规则命令中使用正确的变量,或者路径拼写错误,这些都会导致构建失败。需要提醒用户仔细检查路径是否正确,并在测试时使用echo命令调试变量值。</think>**Makefile无法指定输出文件夹的解决方案** 若Makefile默认将编译结果生成在当前目录,需通过以下方法指定输出路径: --- ### **1. 问题核心原因** - Makefile默认规则未明确指定输出路径。 - 编译命令(如`gcc -o`)未正确指向目标文件夹。 - 输出目录未提前创建导致失败。 --- ### **2. 解决方案** #### **(1) 手动创建输出目录** 在编译前确保输出目录存在: ```makefile # 定义输出目录变量 OUT_DIR = build # 添加目录创建规则 $(OUT_DIR): mkdir -p $(OUT_DIR) ``` #### **(2) 修改编译规则** 在编译命令中指定输出路径(关键步骤): ```makefile # 示例:将.o文件输出到build目录 $(OUT_DIR)/%.o: %.c $(CC) -c $< -o $@ ``` #### **(3) 完整示例** ```makefile CC = gcc OUT_DIR = build SRC = src/main.c src/utils.c OBJ = $(SRC:src/%.c=$(OUT_DIR)/%.o) # 主目标依赖输出目录和.o文件 app: $(OUT_DIR) $(OBJ) $(CC) $(OBJ) -o $(OUT_DIR)/app # 编译规则:从src到build $(OUT_DIR)/%.o: src/%.c $(CC) -c $< -o $@ # 创建输出目录(若不存在) $(OUT_DIR): mkdir -p $@ # 清理时删除输出目录 clean: rm -rf $(OUT_DIR) ``` --- ### **3. 关键技巧** - **路径变量**:用`$(OUT_DIR)`统一管理输出路径。 - **模式规则**:使用`%`匹配文件名,适配多文件场景。 - **依赖关系**:确保目标依赖`$(OUT_DIR)`,目录不存在时自动创建。 --- ### **4. 常见错误** - **路径未创建**:未执行`mkdir -p`导致“No such file”错误。 - **路径拼接错误**:`$(OUT_DIR)/%.o`中漏写斜杠或变量名。 - **清理不彻底**:`clean`规则未删除输出目录。 --- ### **5. 验证方法** ```bash # 运行构建 make # 检查输出目录 ls build/ # 应看到 app 和 .o 文件 ``` 通过上述方法,可将编译结果精准输出到指定目录,保持源码目录整洁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值