C:LINK.EXE从Makefile中失败,但不是从命令行中失败

4 c nmake makefile linker-errors

当我尝试从makefile链接时,出现以下错误:

LINK : fatal error LNK1104: cannot open file 'LIBCMT.lib'.
Run Code Online (Sandbox Code Playgroud)

Makefile执行:

C:\Users\snmcdonald\Desktop\winMake2\winMake2>nmake "_DEBUG=" /f win2.mk build

Microsoft (R) Program Maintenance Utility Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.

        cl /c /ZI /Fo"Debug\\" /Fe"Debug\\" main.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

main.c
        cl /c /ZI /Fo"Debug\\" /Fe"Debug\\" lib.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

lib.c
        lib Debug\lib.obj /out:Debug\lib.lib
Microsoft (R) Library Manager Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.

        link Debug\main.obj Debug\lib.lib /out:Debug\main.exe
Microsoft (R) Incremental Linker Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.

main.obj : warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/OPT:ICF' specif
ication
LINK : fatal error LNK1104: cannot open file 'LIBCMT.lib'
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 10.0\VC\BI
N\link.EXE"' : return code '0x450'
Stop.
Run Code Online (Sandbox Code Playgroud)

但是,如果重新运行失败的行并从控制台链接,则构建成功。我使用的是完全相同的lib,并obj认为从我的make文件制作。

控制台执行:

C:\Users\snmcdonald\Desktop\winMake2\winMake2>link Debug\main.obj Debug\lib.lib /o
ut:Debug\main.exe
Microsoft (R) Incremental Linker Version 10.00.30319.01
Copyright (C) Microsoft Corporation.  All rights reserved.

main.obj : warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/OPT:ICF' specif
ication

C:\Users\SHANEM~1\Desktop\winMake2\winMake2>debug\main.exe
print from lib
Run Code Online (Sandbox Code Playgroud)

我已包含我的makefile供参考。

生成文件

!ifdef _DEBUG
CC = cl
CFLAGS = /c /ZI
FILES = *.c 
OUT = /Fo"Debug\\" /Fe"Debug\\"
LINKOUT = /out:Debug
DIR = Debug
!else
CC = cl
CFLAGS = /O2
FILES = *.c 
OUT = /Fo"Release\\" /Fe"Release\\"
LINKOUT = /out:Release
DIR = Release
!endif

LIB = lib
LINK = link

RM = del
RMFLAGS = *.ojb *.exe 2>NUL

build: main.exe

clean:
    $(RM) $(RMFLAGS)

rebuild: clean build

main.exe: main.obj lib.lib
    $(LINK) $(DIR)\main.obj $(DIR)\lib.lib $(LINKOUT)\main.exe

lib.lib: lib.obj
    $(LIB) $(DIR)\lib.obj $(LINKOUT)\lib.lib

main.obj: 
    $(CC) $(CFLAGS) $(OUT) main.c

lib.obj:
    $(CC) $(CFLAGS) $(OUT) lib.c
Run Code Online (Sandbox Code Playgroud)

测试中

我已经在Visual C版本9和版本10上对此进行了测试。我感到困惑,为什么它在我的makefile上会失败,但是在命令行上手动输入时会成功运行。

解:

nmake /E /f win2.mk build
Run Code Online (Sandbox Code Playgroud)

/ E-使用环境路径覆盖宏变量。

Han*_*ant 5

LIB =库

这搞砸了LIB环境变量。是的,/ E将修复它,但是您实际上需要lib.exe的下一个项目将失败。选择另一个名称,win32.mak使用“ implib”。