2015-11-14 85 views
0

我正在尝试为Windows上的mingw编写的makefile,并将其作为编译器在cl.exe中进行交换。我删除了GCC特有的cflags,并用.obj代替.o。我根本没有改变规则,所以我不知道这是否应该是一个问题。在makefile中用MS cl.exe替换mingw g ++

我得到以下错误...

cl /link build/WavFileTool.obj src/WavFileTool.cpp 
process_begin: CreateProcess(NULL, cl /link build/WavFileTool.obj src/WavFileTool.cpp, ...) failed. 
make (e=2): The system cannot find the file specified. 

这里是我的makefile

CC := cl 
CFLAGS := /link 
BIN_DIR := bin 
BUILD_DIR := build 
SRC_DIR := src 
MAIN := WavFileTool 
TARGET := wavfiletool.exe 
SOURCES := $(wildcard src/*.cpp) 
OBJECTS := $(SOURCES:$(SRC_DIR)/%.cpp=$(BUILD_DIR)/%.obj) 

$(BIN_DIR)/$(TARGET): CREATE_DIRS $(BUILD_DIR)/$(MAIN).obj $(OBJECTS) 
    $(CC) $(OBJECTS) [email protected] 

$(BUILD_DIR)/$(MAIN).obj: $(SRC_DIR)/WavFileTool.cpp 
    $(CC) $(CFLAGS) [email protected] $< 

$(BUILD_DIR)/%.obj: $(SRC_DIR)/%.cpp $(SRC_DIR)/%.h 
    $(CC) $(CFLAGS) [email protected] $< 

CREATE_DIRS: 
    if not exist $(BIN_DIR) mkdir $(BIN_DIR) 
    if not exist $(BUILD_DIR) mkdir $(BUILD_DIR) 

CLEAN: 
    if exist $(BUILD_DIR) rmdir /Q /S $(BUILD_DIR) 

回答

0

与张贴makefile文件的一些问题:

  • CFLAGS应该是“/ c'不'/ link'; MS工具链使用link.exe进行链接,而不是$(CC);
  • cl.exe和link.exe都需要一个开关来指定输出文件。

还有一个不太明显的问题。由于您似乎正在使用mingw'make',因此可能会在'make.exe'的同一目录中存在'link.exe'。简单地从makefile运行'link'会执行mingw'link.exe'而不是MS。为了指示'make'使用MS'链接',你需要提供一个完整的路径,这通常可以从环境中推断出来,例如, '$(VCINSTALLDIR)\ BIN \ LINK.EXE'。

下面是具有必要更改的makefile。

CC := cl 
CFLAGS := /c 
BIN_DIR := bin 
BUILD_DIR := build 
SRC_DIR := src 
MAIN := WavFileTool 
TARGET := wavfiletool.exe 
SOURCES := $(wildcard src/*.cpp) 
OBJECTS := $(SOURCES:$(SRC_DIR)/%.cpp=$(BUILD_DIR)/%.obj) 

$(BIN_DIR)/$(TARGET): CREATE_DIRS $(BUILD_DIR)/$(MAIN).obj $(OBJECTS) 
    $(VCINSTALLDIR)/bin/link /out:[email protected] $(OBJECTS) 

$(BUILD_DIR)/$(MAIN).obj: $(SRC_DIR)/WavFileTool.cpp 
    $(CC) $(CFLAGS) /[email protected] $< 

$(BUILD_DIR)/%.obj: $(SRC_DIR)/%.cpp $(SRC_DIR)/%.h 
    $(CC) $(CFLAGS) /[email protected] $< 

CREATE_DIRS: 
    if not exist $(BIN_DIR) mkdir $(BIN_DIR) 
    if not exist $(BUILD_DIR) mkdir $(BUILD_DIR) 

CLEAN: 
    if exist $(BUILD_DIR) rmdir /Q /S $(BUILD_DIR) 

https://msdn.microsoft.com/en-us/library/19z1t1wy.aspx为全面CL语法(该链接进入到VC++ 2015年的版本,但您可以选择页面上的其他版本),并为https://msdn.microsoft.com/en-us/library/y0zzbyt4.aspx LINK。

+0

添加更改后仍然存在相同的错误。 – ScottF

+0

我更新了答案,以更正CFLAGS和链接命令,这是我第一次错过。 – dxiv