2015-11-14 3 views
0

Я пытаюсь взять make-файл, который был написан для mingw в Windows, и поменять в cl.exe как компилятор. Я удалил флагов, которые были специфическими для GCC, и заменил .o на .obj. Я вообще не изменяю правила, поэтому я не знаю, должно ли это быть проблемой.Замена mingw g ++ с MS cl.exe в makefile

Я получаю следующее сообщение об ошибке ...

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 toolchain использует link.exe для связи, а не $ (CC);
  • и cl.exe, и link.exe требуют переключения для указания выходного файла.

Существует менее очевидная проблема. Поскольку вы, похоже, используете возможности mingw «make», это может быть «link.exe» в том же каталоге с «make.exe». Просто запуск 'link' из make-файла будет выполнять 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

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