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

Posted

技术标签:

【中文标题】C: LINK.EXE 从 Makefile 失败,但不是从命令行失败【英文标题】:C: LINK.EXE fails from Makefile but not from the Command line 【发布时间】:2010-12-18 06:59:58 【问题描述】:

当我尝试从 makefile 链接时,我收到以下错误:

LINK : fatal error LNK1104: cannot open file 'LIBCMT.lib'.

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.

但是,如果我重新运行失败的完全相同的行并从控制台进行链接,我将获得成功的构建。我使用的 libobj 与我的 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

我已包含我的 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

测试

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

解决方案:

nmake /E /f win2.mk build

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

【问题讨论】:

【参考方案1】:

LIB = 库

这搞砸了 LIB 环境变量。是的,/E 会修复它,但你的下一个真正需要 lib.exe 的项目将会失败。选择另一个名字,win32.mak 使用“imlib”。

【讨论】:

【参考方案2】:

文件应该存在于 ...\Microsoft Visual Studio 8\VC\lib

这可能是环境变量设置的差异。从命令行手动运行时检查环境变量设置。

http://us.generation-nt.com/answer/lnk1104-open-file-libcmt-lib-help-21575202.html

LIB 环境变量应该 包含各种库的路径 目录。您还可以运行 VCVARS32.BAT 文件,它将 自动设置环境 为你。如果你做了很多命令 线构建,我建议创建一个 调用上述内容的快捷方式 提到VSVARS32.BAT

【讨论】:

一些优点,但我没有运气。我尝试在我的 makefile 中运行 VCVARS32.BAT,从控制台运行 VCVARS32BAT,并尝试添加“/LIBPATH:”C:\Program Files\Microsoft Visual Studio 10.0\VC\lib”作为链接器选项。 你能在你的磁盘中找到那个文件吗? 是:“C:\Program Files\Microsoft Visual Studio 10.0\Common7\Tools\vsvars32.bat”。此外,当我说控制台时,我指的是 Visual Studio 2010 提示。

以上是关于C: LINK.EXE 从 Makefile 失败,但不是从命令行失败的主要内容,如果未能解决你的问题,请参考以下文章

dumpbin-link-mspdb60

C语言常见编译错误及分析

具有 2 个源目录的 makefile 使包含保护失败

VS2015 CE - 找不到 Link.exe

如何找出是啥引入了 AVX 标志

Makefile 项目 - 通过“-j”参数使用多个作业时防止构建失败