繁体   English   中英

在makefile中用MS cl.exe替换mingw g ++

[英]Replacing mingw g++ with MS cl.exe in makefile

我正在尝试获取在Windows上为mingw编写的makefile,并在cl.exe中交换作为编译器。 我删除了特定于GCC的cflag,然后将.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.

这是我的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) $@ 

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

发布的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“ link”,您需要提供完整路径,通常可以从环境中推断出该路径,例如“ $(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:$@ $(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)

有关完整的CL语法,请参见https://msdn.microsoft.com/zh-cn/library/19z1t1wy.aspx (链接指向VC ++ 2015版本,但您可以在页面上选择其他版本),以及https:/ /msdn.microsoft.com/en-us/library/y0zzbyt4.aspx(用于LINK)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM