You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用nmake编译C项目时遇LNK1104错误:无法打开LIBCMT.lib

Windows 10下VS2019 nmake编译C项目报错找不到LIBCMT.lib

在“Developer Command Prompt for Visual Studio 2019”中手动执行编译命令一切正常,但使用nmake时出现以下错误:

LINK : fatal error LNK1104: cannot open file 'LIBCMT.lib'
NMAKE : fatal error U1077: ""C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30133\bin\HostX64\x64\cl.EXE"" : return code '0x2'
Stop.

我的Makefile内容

# Define variables
CC = cl
CFLAGS = /MT /I include          /nologo /D_CRT_SECURE_NO_WARNINGS         /W4 /Od /DDEBUG
LIB = lib
LIBFLAGS = /OUT:my_library.lib /nologo
SRC_DIR = src
INCLUDE_DIR = include
LIB_NAME = my_library
OBJ = my_library.obj
TARGET = my_program.exe

# Default target
all: $(TARGET)

# Rule to compile the library source file
$(OBJ): $(SRC_DIR)\$(LIB_NAME).c
    @echo Compiling $(SRC_DIR)\$(LIB_NAME).c
    $(CC) $(CFLAGS) /c $(SRC_DIR)\$(LIB_NAME).c /Fo$(OBJ)

# Rule to create the static library
$(LIB_NAME).lib: $(OBJ)
    @echo Creating library $(LIB_NAME).lib
    $(LIB) $(LIBFLAGS) $(OBJ)

# Rule to compile the main program
$(TARGET): main.obj $(LIB_NAME).lib
    @echo Compiling and linking main.c to create $(TARGET)
    $(CC) /nologo /Fe$(TARGET) main.obj $(LIB_NAME).lib /link /LIBPATH:"C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30133\lib\x64" /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\ucrt\x64" /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64"

# Rule to compile main.c
main.obj: main.c
    @echo Compiling main.c
    $(CC) $(CFLAGS) /c main.c /Fomain.obj

# Clean up intermediate files
clean:
    @echo Cleaning up...
    del $(OBJ) $(LIB_NAME).lib main.obj $(TARGET)

手动执行的正常命令

cl /MT /I include /nologo /D_CRT_SECURE_NO_WARNINGS /W4 /Od /DDEBUG /c src\my_library.c /Fomy_library.obj
lib /OUT:my_library.lib /nologo my_library.obj
cl /MT /I include /nologo /D_CRT_SECURE_NO_WARNINGS /W4 /Od /DDEBUG /c main.c /Fomain.obj
cl /MT /I include /nologo /D_CRT_SECURE_NO_WARNINGS /W4 /Od /DDEBUG /Fe my_program.exe main.obj my_library.lib /link /LIBPATH:"C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30133\lib\x64" /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\ucrt\x64" /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64"

疑问

  1. 为何手动命令可正常运行,但nmake却无法找到LIBCMT.lib?
  2. 如何确保nmake能正确找到并链接LIBCMT.lib?

解答

问题1原因

对比手动命令和Makefile的链接规则可以发现:手动执行的最后一条链接命令包含了/MT选项,但Makefile中生成$(TARGET)的链接命令没有添加该选项。/MT是指定使用**多线程静态C运行时库(LIBCMT.lib)**的编译选项,你的目标文件(main.obj、my_library.obj)都是通过/MT编译生成的,链接时必须匹配相同的运行时库选项。Makefile的链接命令缺少/MT,导致链接器无法识别需要加载LIBCMT.lib,进而出现找不到文件的错误。

问题2解决方法

修改Makefile中生成$(TARGET)的规则,在cl命令中加入$(CFLAGS)(已包含/MT),或者直接添加/MT参数。修改后的规则如下:

# Rule to compile the main program
$(TARGET): main.obj $(LIB_NAME).lib
    @echo Compiling and linking main.c to create $(TARGET)
    $(CC) $(CFLAGS) /nologo /Fe$(TARGET) main.obj $(LIB_NAME).lib /link /LIBPATH:"C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30133\lib\x64" /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\ucrt\x64" /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64"

这样修改后,链接命令会继承CFLAGS中的/MT选项,确保链接器正确定位并使用LIBCMT.lib,与编译阶段的运行时库选项保持一致。

另外,也可以单独定义链接专用的变量(比如LDFLAGS = /MT),然后在链接命令中加入$(LDFLAGS),结构更清晰:

# 添加链接选项变量
LDFLAGS = /MT

# 修改后的链接规则
$(TARGET): main.obj $(LIB_NAME).lib
    @echo Compiling and linking main.c to create $(TARGET)
    $(CC) $(LDFLAGS) /nologo /Fe$(TARGET) main.obj $(LIB_NAME).lib /link /LIBPATH:"C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30133\lib\x64" /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\ucrt\x64" /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\lib\10.0.19041.0\um\x64"

内容的提问来源于stack exchange,提问作者Kilter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 03:44:55