Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在makefile中的编译器之间切换?_C++_Makefile - Fatal编程技术网

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

C++ 如何在makefile中的编译器之间切换?,c++,makefile,C++,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

我有以下生成文件:

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)
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
对象=$(源:.cpp=.o)
MOBJECTS=$(MSOURCES:.cpp=.o)
可执行文件=h2r.dll
MEXECUTABLE=h2r
CC=i686-w64-mingw32-g++
CC=g++
全部:清洁$(MSOURCES)$(可执行)
dll:clean$(源代码)$(可执行文件)
$(可执行):$(移动对象)
$(CC)$(MLDFLAGS)$(MOBJECTS)-o$@
$(可执行文件):$(对象)
$(CC)$(LDFLAGS)$(对象)-o$@
.cpp.o:
$(CC)$(CFLAGS)$<-o$@
清洁:
rm*.o$(可执行)$(可执行)

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

定义两个不同的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 $@

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

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

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

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

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

只需在目标中使用相关的文件即可。

不过,他使用相同的规则编译.cpp文件。现在您只需更改用于链接程序的编译器。这是真的,将其拆分为两个单独的规则也很有意义。可以为一个规则
.cpp.o
文件和其他
.o
文件创建规则。因此,您不需要一直覆盖其他文件,也不需要一直重新编译所有文件。