一个Makefile中有多个编译器

一个Makefile中有多个编译器,makefile,cross-compiling,Makefile,Cross Compiling,我在这里找到了,这正是我想要的。然而,作为makefiles的新手,我很难看到如何在当前设置中实现第二个答案 我有一个简单的makefile,在为Linux编译或为Windows交叉编译时,我希望使用不同的编译器。如前所述,下面的文件有效。对于Linux,我只需键入make,对于windows,我键入makeOS=win。为了更好地了解makefiles的工作原理,我希望能够在当前Makefile中实现链接答案,这样我就可以通过键入链接问题中所示的make win或make cross来实现wi

我在这里找到了,这正是我想要的。然而,作为makefiles的新手,我很难看到如何在当前设置中实现第二个答案

我有一个简单的makefile,在为Linux编译或为Windows交叉编译时,我希望使用不同的编译器。如前所述,下面的文件有效。对于Linux,我只需键入
make
,对于windows,我键入
makeOS=win
。为了更好地了解makefiles的工作原理,我希望能够在当前Makefile中实现链接答案,这样我就可以通过键入链接问题中所示的
make win
make cross
来实现windows

有人能帮我理解在我这里的具体案例中,链接答案中的结构是如何实现的吗?大概有一种比将
原生:
交叉:
作为目标并在两者之间复制几乎全部代码更优雅的方法

任何关于清理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)/*~ 
ifeq($(操作系统),win)
CC=x86_64-w64-mingw32-gcc
OUT=cusum.exe
其他的
CC=gcc
OUT=cusum
恩迪夫
CFLAGS=-D_GNU_SOURCE-O3-Wall-Wextra-lm——静态
DEPS=bessel.h detector.h io.h stepfit.h lmmin_int64.h utils.h
ODIR=obj
_OBJ=主.o贝塞尔.o检测器.o io.o最小值\u int64.o阶跃拟合.o实用程序.o
OBJ=$(patsubst%,$(ODIR)/%,$(_OBJ))
LIBS=-lm
$(ODIR)/%.o:%.c$(DEPS)
$(CC)-c-o$@$<$(CFLAGS)
$(OUT):$(OBJ)
$(CC)-o$@$^$(CFLAGS)
.假冒:干净
清洁:
rm-f$(OUT)$(ODIR)/*.o*~核心$(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)/*~

现在您可以运行
makewin
,它将递归调用
make
覆盖适当的变量。

这需要一些小的调整,我已经对您的答案进行了调整,供您审阅。然而,这打破了clean(或者更确切地说,clean只对本机编译有效,而不适用于win编译)。您是否可以建议一个调整以使其再次工作(类似于
使win保持干净
)?您是否需要为每个目标制定单独的干净规则?为什么不让一条干净的规则把一切都清理干净呢?
win:
        $(MAKE) CC=x86_64-w64-mingw32-gcc E=.exe O=obj ODIR=wobj