使用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"
疑问
- 为何手动命令可正常运行,但nmake却无法找到LIBCMT.lib?
- 如何确保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
相关产品推荐
相关产品推荐

