2010-12-18 5 views
4

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.

Antwort

4

LIB = lib

, dass die Schrauben des LIB-Umgebungsvariable auf. Ja,/E wird es beheben, aber Ihr nächstes Projekt, das lib.exe benötigt, wird fehlschlagen. Wählen Sie einen anderen Namen, win32.mak verwendet "implib".

0

Die Datei sollte in existieren ... \ Microsoft Visual Studio 8 \ VC \ lib

Es Unterschied von Umgebungsvariablen könnte festlegen. Überprüfen Sie die Einstellung für Umgebungsvariablen, wenn Sie sie manuell über die Befehlszeile ausführen.

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

The LIB environment variable should contain the path to your various lib directories. You can also run the VCVARS32.BAT file, which will automatically set the environment up for you. If you do a lot of command line builds, I recommend creating a shortcut that invokes the above mentioned VSVARS32.BAT

+0

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. –

+0

können Sie diese Datei finden auf Ihrem Datenträger? –

+0

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. –