我在这里找到了这个问题,正是我想要的。但是,由于是makefile的新手,所以我很难看清如何在当前设置中实现第二个答案。
我有一个简单的makefile,在Linux编译或Windows交叉编译时,我想使用不同的编译器。如图所示,下面的文件有效。对于Linux,我只输入make
,对于Windows make os=win
。为了学习makefile的工作原理,我希望能够在当前的Makefile中实现链接的答案,以便我可以通过键入make win
或make cross
按链接的问题中的说明来制作Windows 。
有人可以帮助我了解如何在我这里遇到的特定情况下实现链接答案中呈现的结构吗?大概有一种比拥有native:
和cross:
目标以及在两者之间复制几乎全部代码更好的方法。
通常也欢迎任何清理Makefile的建议。
ifeq ($(os),win)
CC=x86_64-w64-mingw32-gcc
OUT=cusum.exe
else
CC=gcc
OUT=cusum
endif
CFLAGS=-D_GNU_SOURCE -O3 -Wall -Wextra -lm --static
DEPS=bessel.h detector.h io.h stepfit.h lmmin_int64.h utils.h
ODIR=obj
_OBJ=main.o bessel.o detector.o io.o lmmin_int64.o stepfit.o utils.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
LIBS=-lm
$(ODIR)/%.o: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
$(OUT): $(OBJ)
$(CC) -o $@ $^ $(CFLAGS)
.PHONY: clean
clean:
rm -f $(OUT) $(ODIR)/*.o *~ core $(INCDIR)/*~
您只需引入一个更高级别的目标。特定于目标的变量由其先决条件继承,因此您不必更改所有目标。
但是,您无法使用此方法更新目标或先决条件的内容,因此无法删除的分配OUT
。这意味着您无法摆脱OS
变量分配。
一种简单的方法是使用make的回溯调用。正常写入makefile:
O = o
E =
CC = gcc
OUT = cusum$E
CFLAGS = -D_GNU_SOURCE -O3 -Wall -Wextra -lm --static
DEPS = bessel.h detector.h io.h stepfit.h lmmin_int64.h utils.h
ODIR = obj
_OBJ = main.$O bessel.$O detector.$O io.$O lmmin_int64.$O stepfit.$O utils.$O
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))
LIBS = -lm
$(ODIR)/%.$O: %.c $(DEPS)
$(CC) -c -o $@ $< $(CFLAGS)
$(OUT): $(OBJ)
$(CC) -o $@ $^ $(CFLAGS)
.PHONY: clean
clean:
rm -rf $(OUT)* obj wobj *~ core $(INCDIR)/*~
然后添加一个递归调用的目标,使make覆盖相关变量(确保将其放在目标的末尾或至少在$(OUT)
目标之后):
win:
$(MAKE) CC=x86_64-w64-mingw32-gcc E=.exe O=obj ODIR=wobj
现在,您可以运行make win
,它将递归调用make
覆盖适当的变量。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句