Build 同时为target和x86构建对象的简单方法

Build 同时为target和x86构建对象的简单方法,build,compilation,makefile,cross-compiling,Build,Compilation,Makefile,Cross Compiling,目前,这就是我为x86编译器构建对象文件的方式 CC=g++ %.o: %.cpp $(CC) $(CFLAGS) $(INCPATH) $(LIBPATH) -DPC -c $^ -o $@ 如何在g++和交叉编译器之间轻松切换?如何同时为目标编译x86和二进制文件?我现在似乎只限于使用一个编译器进行编译。有没有一种方法可以做到这一点,而不必逐个列出我的所有对象文件?您可以在给出make时传递工具链 只要一个额外的变量交叉编译就可以做到这一点 makefile看起来更像这样 CRO

目前,这就是我为x86编译器构建对象文件的方式

CC=g++
%.o: %.cpp
     $(CC) $(CFLAGS) $(INCPATH) $(LIBPATH) -DPC -c $^ -o $@

如何在g++和交叉编译器之间轻松切换?如何同时为目标编译x86和二进制文件?我现在似乎只限于使用一个编译器进行编译。有没有一种方法可以做到这一点,而不必逐个列出我的所有对象文件?

您可以在给出make时传递工具链

只要一个额外的变量
交叉编译
就可以做到这一点

makefile看起来更像这样

CROSS_COMPILE :=

CC=$(CROSS_COMPILE)g++


%.o: %.cpp

     $(CC) $(CFLAGS)$(INCPATH) $(LIBPATH) -DPC -c $^ -o $@
因此,如果您只给出
make
,那么
CC
将用作
g++
并为x86编译,如果您给出
make CROSS\u COMPILE=arm none linux gnueabi-
则它将为
arm
编译


您可以使用任何您想要的工具链概念保持不变

Sagar的答案确实解决了如何在编译器之间切换,但没有解决如何同时实现这两个目标以及问题的主要部分,即如何同时实现这两个目标

要同时执行这两个目标,您可能需要将对象分离到与所使用的编译器或目标相关的目录中,然后根据对象的目录确定要使用的编译器

下面是最简单的例子,源代码位于当前目录中,目录与编译器名称相同。在用户定义的编译器函数中,根据对象文件的目录(函数的参数$1)填写您希望如何计算编译器名称

define COMPILER
$1
endef

.PRECIOUS: %/.
%/.:
        mkdir -p $@

.SECONDEXPANSION:
%.o: $$(notdir $$*.cpp) | $$(@D)/.
        $(call COMPILER, $(@D)) -c $< -o $@
定义编译器
$1
恩德夫
.珍贵:%/。
%/.:
mkdir-p$@
.第二次扩展:
%.o:$$(notdir$$*.cpp)|$$(@D)/。
$(调用编译器,$(@D))-c$<-o$@

什么是合适的语法。作为依赖项的SECONDEXPANSION是什么?它会是target:.SECONDEXPANSION吗?@Olihoops它不是依赖项,它只是一个内置关键字,请查看手册,它是必需的,这样我就可以在这里计算$$