一个Makefile中有多个编译器

KBriggs

我在这里找到了这个问题,正是我想要的。但是,由于是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)/*~ 
疯狂的科学家

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

但是,您无法使用此方法更新目标或先决条件的内容,因此无法删除的分配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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

这是一个Java编译器错误?

第一个编译器是如何编写的?

好吧,要么我疯了,要么IBM的编译器中有一个错误

为什么编译器会发出一个stloc和一个ldloca?

当没有闭包时,为什么编译器为委托添加一个额外的参数?

一个docker中有多个dockerfile或一个dockerfile中有多个映像

本地设置的Cython编译器指令会影响一个或所有功能吗?

是否有一个编译器设置来控制在Delphi中如何键入浮点文字?

同一程序在一个编译器中而不是其他编译器中给出编译器错误

GCC编译器一个字节中有多少位数

一个计时器触发器类中有多个Azure函数

如何编译一个编译器阶段的输出?

一个查询中有多个SUM,其中多个

我的模拟器中有多个应用程序可用于一个项目

是否有一个官方的C编译器,如何安装?

一个控制器中有多个模型,可在Codeigniter中进行编码实践

一个GSP中有多个<g:select>,控制器内部的HQL中有多个参数

如何告诉编译器“忽略”一个类?

编译器说有一个无法到达的语句,我在做什么错?

一个控制器中有多个存储库

第一个编译器是如何编译的?

我不知道输出代码是什么。编译器说第3行的标识符中有一个无效字符

我的代码中显然有一个可选项,但编译器认为我没有

gcc 是否有一个工具或编译器选项可以计算“编译的代码行数”?

是否有一个 gcc 编译器选项可以帮助捕获形式和实际参数类型不匹配?

如何在一个makefile中编译多个项目

C++ msvc 编译器没有类型检查函数参数是一个引用

当我有一个虚方法时,构造函数被编译器删除了?

OpenCl 是一个库还是一个编译器?