2015-11-26 3 views
3

У меня есть следующие Makefile:Как я могу переключаться между компиляторами в make-файле?

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 [email protected] 

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(LDFLAGS) $(OBJECTS) -o [email protected] 

.cpp.o: 
    $(CC) $(CFLAGS) $< -o [email protected] 

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

Как я могу инициализировать CC с кросс-компилятор (CC=i686-w64-mingw32-g++), когда команда make dll излучается и как я могу использовать ГНУ компилятор, когда make all излучается?

ответ

4

Чтобы установить переменную на основе того, что цель выполняется, вы можете сделать что-то вроде:

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

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

Это решает мою проблему. Благодарю. –

3

Определите два разных CC вместо того, чтобы их переопределить. Поскольку у вас есть разные правила для all и dll, вы можете просто использовать другой компилятор в другом правиле. Как-то вроде этого:

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

all: clean $(MSOURCES) $(MEXECUTABLE) 


dll: clean $(SOURCES) $(EXECUTABLE) 


$(MEXECUTABLE): $(MOBJECTS) 
    $(CCALL) $(MLDFLAGS) $(MOBJECTS) -o [email protected] 

$(EXECUTABLE): $(OBJECTS) 
    $(CCDLL) $(LDFLAGS) $(OBJECTS) -o [email protected] 
+1

Он использует то же правило для компиляции .cpp-файлов. Теперь вы меняете только компилятор, используемый для связывания программы. – gurka

+0

Thats true, сделал бы смысл разделить это на два отдельных правила. Возможно, создайте одно правило '.cpp.o' и другие' .o' файлы. Поэтому вы не перезаписываете другие файлы все время и, следовательно, не нужно перекомпилировать все файлы все время снова. –

1

Ваше перезапись, что находится в переменной CC. Почему бы вам просто не позвонить:

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

И просто используйте соответствующее в своих целях.

Смежные вопросы