Замена mingw g ++ на MS cl.exe в make-файле

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

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

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.

И вот мой make-файл

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) $@

$(BUILD_DIR)/$(MAIN).obj: $(SRC_DIR)/WavFileTool.cpp
$(CC) $(CFLAGS) $@ $<

$(BUILD_DIR)/%.obj: $(SRC_DIR)/%.cpp $(SRC_DIR)/%.h
$(CC) $(CFLAGS) $@ $<

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

Решение

Некоторые проблемы с make-файлом, как написано:

  • CFLAGS должен быть «/ c», а не «/ link»;
  • цепочка инструментов MS использует link.exe для компоновки, а не $ (CC);
  • и cl.exe, и link.exe требуют переключения для указания выходного файла.

Есть и менее очевидная проблема. Поскольку вы, кажется, используете mingw ‘make’, есть вероятность, что в той же директории, где находится ‘make.exe’, может быть файл ‘link.exe’. Простой запуск ‘link’ из make-файла приведет к выполнению mingw ‘link.exe’, а не MS. Чтобы указать ‘make’ использовать ‘ссылку’ MS ‘, вам необходимо указать полный путь, который обычно может быть выведен из среды, например, ‘$ (VCINSTALLDIR) \ Bin \ link.exe.

Ниже приведен make-файл с необходимыми изменениями.

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:$@ $(OBJECTS)

$(BUILD_DIR)/$(MAIN).obj: $(SRC_DIR)/WavFileTool.cpp
$(CC) $(CFLAGS) /Fo$@ $<

$(BUILD_DIR)/%.obj: $(SRC_DIR)/%.cpp $(SRC_DIR)/%.h
$(CC) $(CFLAGS) /Fo$@ $<

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 для ССЫЛКИ.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]