gcc生成目标文件时创建目录
Create directories when generating object files in gcc
gcc -o abc/def.o def.c
在目录abc
中生成def.o
文件;仅当存在目录 abc
时。
有没有办法让gcc在生成的目标文件所在目录不存在的情况下创建一个目录?如果没有,那么自动提前创建目录的最简单方法是什么,尤其是对于 Makefile?
从 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)
我这样做的方法是找出路径,并为它们创建目录:
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
gcc -o abc/def.o def.c
在目录abc
中生成def.o
文件;仅当存在目录 abc
时。
有没有办法让gcc在生成的目标文件所在目录不存在的情况下创建一个目录?如果没有,那么自动提前创建目录的最简单方法是什么,尤其是对于 Makefile?
从 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)
我这样做的方法是找出路径,并为它们创建目录:
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