2015-11-14 82 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