C: LINK.EXE не работает из Makefile, но не из командной строки

Когда я пытаюсь создать ссылку из make-файла, я получаю следующую ошибку:

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.

Однако, если я повторно запущу ту же самую строку, которая не удалась, и ссылку с консоли, я получу успешную сборку. Я использую точно такие же lib и obj, которые были созданы из моего 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

Я включил свой make-файл для справки.

Создать файл

!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. Я не понимаю, почему он не работает в моем make-файле, но успешно запускается при ручном вводе в командной строке.

Решение:

nmake /E /f win2.mk build

/E - переопределяет переменные макроса с путями окружения.


person Community    schedule 18.12.2010    source источник


Ответы (2)


БИБ = библиотека

Это портит переменную среды LIB. Да, /E это исправит, но ваш следующий проект, который действительно нуждается в lib.exe, потерпит неудачу. Выберите другое имя, win32.mak использует «implib».

person Hans Passant    schedule 18.12.2010

Файл должен находиться в ...\Microsoft Visual Studio 8\VC\lib

Это может быть разница в настройке переменных среды. Проверьте, каковы настройки переменных среды, когда вы запускаете его вручную из командной строки.

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

Переменная среды LIB должна содержать путь к вашим различным каталогам lib. Вы также можете запустить файл VCVARS32.BAT, который автоматически настроит для вас среду. Если вы делаете много сборок из командной строки, я рекомендую создать ярлык, который вызывает вышеупомянутый VSVARS32.BAT.

person Madhur Ahuja    schedule 18.12.2010
comment
Несколько хороших моментов, но мне не повезло. Я попытался запустить VCVARS32.BAT внутри моего make-файла, запустить VCVARS32BAT из консоли и попытался добавить /LIBPATH:C:\Program Files\Microsoft Visual Studio 10.0\VC\lib в качестве параметров компоновщика. - person ; 18.12.2010
comment
Можете ли вы найти этот файл на вашем диске? - person Madhur Ahuja; 18.12.2010
comment
Да: C:\Program Files\Microsoft Visual Studio 10.0\Common7\Tools\vsvars32.bat . Кроме того, когда я говорю консоль, я имею в виду подсказку Visual Studio 2010. - person ; 18.12.2010