Wenn ich versuche, von einer Make-Datei zu verknüpfen ich die folgenden Fehlermeldung erhalten:C: Link.exe von Makefile schlägt fehl, aber nicht von der Kommandozeile
LINK : fatal error LNK1104: cannot open file 'LIBCMT.lib'.
Makefile Ausführung:
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.
Wenn ich jedoch genau die gleiche Zeile, die fehlgeschlagen ist, und die Verbindung von der Konsole aus ausführen, bekomme ich einen erfolgreichen Build. Ich verwende genau die gleichen lib
und obj
, die aus meiner Make-Datei erstellt wurden.
Console Ausführung:
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
Ich habe mein Make-Datei als Referenz enthalten.
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
Testing
ich dies sowohl auf Visual C Version 9 und Version getestet habe 10. Ich bin verwirrt, warum es auf meiner Make-Datei fehlschlagen würde, aber erfolgreich ausgeführt werden, wenn sie manuell in der Befehlszeile eingegeben.
Lösung:
nmake /E /f win2.mk build
/E - überschreibt Makro Vars mit Umweltpfade.
Einige gute Punkte, aber ich hatte kein Glück. Ich habe versucht, VCVARS32.BAT in meinem Makefile, VCVARS32BAT von der Konsole ausgeführt, und ich habe versucht, "/ LIBPATH:" C: \ Programme \ Microsoft Visual Studio 10.0 \ VC \ lib "als Linker-Optionen. –
können Sie diese Datei finden auf Ihrem Datenträger? –
Ja: "C: \ Programme \ Microsoft Visual Studio 10.0 \ Common7 \ Tools \ vsvars32.bat". Zusätzlich, wenn ich Konsole sage, meine ich die Visual Studio 2010-Eingabeaufforderung. –