【问题标题】:Replacing mingw g++ with MS cl.exe in makefile在makefile中用MS cl.exe替换mingw g++
【发布时间】:2015-11-14 03:50:35
【问题描述】:

我正在尝试使用为 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)

【问题讨论】:

    标签: c++ visual-c++ makefile cl


    【解决方案1】:

    发布的 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'。

    以下是包含必要更改的生成文件。

    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 获取 LINK。

    【讨论】:

    • 添加更改后,同样的错误仍然存​​在。
    • 我更新了答案以更正 CFLAGS 和链接命令,我第一次错过了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多