如何在makefile中的编译器之间切换?

时间:2015-11-26 09:00:43

标签: c++ makefile

我有以下makefile:

CFLAGS=-c -Wall -std=c++11
MCFLAGS=-c -Wall -std=c++11

LDFLAGS= -shared
MLDFLAGS= 

MSOURCES=main.cpp MCC.cpp Point3D.cpp
SOURCES= mainDLL.cpp MCC.cpp Point3D.cpp

OBJECTS=$(SOURCES:.cpp=.o)
MOBJECTS=$(MSOURCES:.cpp=.o)

EXECUTABLE=h2r.dll
MEXECUTABLE=h2r

CC=i686-w64-mingw32-g++
CC=g++

all: clean $(MSOURCES) $(MEXECUTABLE)


dll: clean $(SOURCES) $(EXECUTABLE)


$(MEXECUTABLE): $(MOBJECTS)
    $(CC) $(MLDFLAGS) $(MOBJECTS) -o $@

$(EXECUTABLE): $(OBJECTS)
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@

.cpp.o:
    $(CC) $(CFLAGS) $< -o $@

clean: 
    rm *.o $(MEXECUTABLE) $(EXECUTABLE)

如何在发出CC=i686-w64-mingw32-g++命令时使用交叉编译器(make dll)初始化CC,以及在发出make all时如何使用gnu编译器?

3 个答案:

答案 0 :(得分:4)

要根据正在执行的目标设置变量,您可以执行以下操作:

all: CC=g++
all: clean $(MSOURCES) $(MEXECUTABLE)

dll: CC=i686-w64-mingw32-g++
dll: clean $(SOURCES) $(EXECUTABLE)

答案 1 :(得分:3)

定义两个不同的CC而不是重新定义一个CC。由于您对all和dll有不同的规则,因此您可以在其他规则中使用其他编译器。不知怎的,这样:

CCDLL=i686-w64-mingw32-g++
CCALL=g++

all: clean $(MSOURCES) $(MEXECUTABLE)


dll: clean $(SOURCES) $(EXECUTABLE)


$(MEXECUTABLE): $(MOBJECTS)
    $(CCALL) $(MLDFLAGS) $(MOBJECTS) -o $@

$(EXECUTABLE): $(OBJECTS)
    $(CCDLL) $(LDFLAGS) $(OBJECTS) -o $@

答案 2 :(得分:1)

你覆盖CC变量中的任何内容。你为什么不拥有:

CC_DLL=i686-w64-mingw32-g++
CC=g++

只需在目标中使用相关的一个。