在gcc中生成目标文件时创建目录

e3bfsja2  于 2022-11-13  发布在  其他
关注(0)|答案(3)|浏览(231)

gcc -o abc/def.o def.cabc目录下生成def.o文件;仅当存在目录abc时。
当生成的目标文件的封闭目录不存在时,有没有方法让gcc创建一个目录?如果没有,提前自动创建目录的最简单的方法是什么,特别是对于Makefile?

2ledvvac

2ledvvac1#

this post看,似乎没有办法从gcc创建目录。
对于makefile,我可以使用以下代码片段。

OBJDIR = obj
MODULES := src src2
...

OBJDIRS := $(patsubst %, $(OBJDIR)/%, $(MODULES))

build: $(OBJDIRS)
    echo $^

$(OBJDIRS):
    mkdir -p $@

make build将创建目录,并回显结果。
我们也可以使目标文件自动创建而不调用make build

PROG := hellomake
LD   := gcc
...
$(PROG): $(OBJDIRS) obj/src/hellofunc.o obj/src/hellomake.o
    $(LD) $(filter %.o, $^) -o $(PROG)
guz6ccqo

guz6ccqo2#

我这样做的方法是我找出路径将是什么,并为他们创建目录:

SOURCES:=$(shell find $(SRC)/ -type f -name '*.c') #Get all the c files

#Get the files they're gonna be compiled to
OBJECTS:=$(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(SOURCES))

#Get just the paths so you can create them in advance
OBJDIRS:=$(dir $(OBJECTS))

#call mkdir with the directories (using a dummy var because too much 
#trouble to deal with priorities) someone could prob do better
#--parents ignores the repeated and already existing errors
DUMMY:=$(shell mkdir --parents $(OBJDIRS))

酱料:https://www.gnu.org/software/make/manual/html_node/File-Name-Functions.html

qnakjoqk

qnakjoqk3#

除了先前的解决方案之外,您还可以在规则中创建目录以构建.o文件

$(OBJ_DIR)/%.o: $(SRCS_DIR)/%.c
    @mkdir -p $(shell dirname $@)
    $(CC) $(CFLAGS) $(INC) -c $< -o $@
  • mkdir前面的“@”表示mkdir的输出为静音(我们不希望为每个创建的目录都显示一条消息)。
  • “-p”选项告诉mkdir在path中创建所有中间目录(如果它们不存在)。
  • “dirname”方法采用文件路径(“$@”)并仅保留文件目录路径。

相关问题