【问题标题】:Multiple compilers in one Makefile一个 Makefile 中的多个编译器
【发布时间】:2019-06-17 11:04:41
【问题描述】:

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

我有一个简单的 makefile,我想在为 Linux 编译或为 Windows 交叉编译时使用不同的编译器。如前所述,以下文件有效。对于 Linux,我只需键入 make,对于 Windows,我键入 make os=win。为了了解makefile如何更好地工作,我希望能够在当前的Makefile中实现链接的答案,这样我就可以通过键入make winmake 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)/*~ 

【问题讨论】:

    标签: makefile cross-compiling


    【解决方案1】:

    你只需要引入一个上层目标。特定于目标的变量由其先决条件继承,因此您不必更改所有目标。

    但是,您无法使用此方法更新目标或先决条件的内容,因此您无法删除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,覆盖适当的变量。

    【讨论】:

    • 这适用于一些小的调整,我已经对您的回答进行了审查,以供您审查。但是,这会破坏干净(或者更确切地说,clean 仅适用于本机编译,而不适用于 win 编译)。您能否建议进行调整以使其再次正常工作(例如make win clean)?
    • 您是否需要为每个目标制定单独的清理规则?为什么不让单一的清理规则清理所有内容?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    相关资源
    最近更新 更多