Как преобразовать старый код Visual C ++ (VC + + 6,0) в Visual Studio 2019, отсутствует библиотека c - PullRequest
0 голосов
/ 23 января 2020

У меня есть какой-то старый код Visual C ++ (v 6.0), который запускается как приложение CLI и собирается с помощью файла nmake, который я хотел бы преобразовать во что-то, что я могу построить (в окне оболочки, не находящемся под IDE) в Visual Studio 2019. Он использует библиотеку, которую я строю аналогичным образом. Мои make-файлы будут включены внизу.

Я нашел c:\program files (x86)\microsoft visual studio 14.0\common7\tools\vsvars32.bat, и с этим я могу запускать nmake по мере необходимости (у меня есть файл .bat, который собирает около 30 из этих программ в качестве своего рода тестовой базы для инструмент и его библиотеку, и я запускаю его в Emacs и сравниваю выходные данные с последним, когда я его запускал, ожидая, что единственными отличиями будут метки даты и времени, версии компилятора и тому подобное.)

Однако, когда Я перехожу к этапу линковки, получаю ошибку LINK : fatal error LNK1104: cannot open file 'LIBC.lib'

Я посмотрел в соответствующей директории lib и нашел много вариантов libcxxx.lib, но не было простой lib c .lib. Я не знаю, является ли проблема аргументами командной строки, которые я передал в CL или что-то еще. Отсюда и этот вопрос.

# makefile for prog (a hello world type example)
DEFINES=
INCLUDES= -I. -I.\inc.vc -I\yxx\inc.vc -I\yxx\lib.vc
CXXFLAGS= /c /Od /W3 /Za $(DEFINES) $(INCLUDES)
CXX=cl

OBJECTS=yy_main.obj \
    yy_mylex.obj \
    yy_mypsr.obj

yy_main.obj: \yxx\lib.vc\yy_main.cpp yy_mypsr.h yy_err.tbl yy_syna.tbl
    echo $(CXXFLAGS) >$*.OPT
    $(CXX) /Fo$@ @$*.OPT \yxx\lib.vc\$*.CPP >$*.ERR
    TYPE $*.ERR

yy_mylex.obj: yy_mylex.cpp yy_mylex.h
    echo $(CXXFLAGS) >$*.OPT
    $(CXX) /Fo$@ @$*.OPT $*.CPP >$*.ERR
    TYPE $*.ERR

yy_mypsr.obj: yy_mypsr.cpp
    echo $(CXXFLAGS) >$*.OPT
    $(CXX) /Fo$@ @$*.OPT $*.CPP >$*.ERR
    TYPE $*.ERR

prog.exe: $(OBJECTS) \yxx\lib.vc\yy_lol.lib
    CL @<<
$(OBJECTS)
\yxx\lib.vc\yy_lol.lib
/link /out:prog.exe
<<


# makefile for yy_lol.lib (lists of object files pruned to be smaller)
DEFINES= -Dyy_assert_disable_
INCLUDES= -I. -I\yxx\inc.vc -I\yxx\lib.vc
ARFLAGS=
CXXFLAGS= /c /Od /W3 /Za $(DEFINES) $(INCLUDES)
CXX=cl
AR=LIB
RM=del

OBJECTS=\yxx\lib.vc\yy_asrt.obj \
    \yxx\lib.vc\yy_ast.obj \
    \yxx\lib.vc\yy_bktrk.obj \
    \yxx\lib.vc\yy_buf.obj \
    \yxx\lib.vc\yy_sym.obj

.cpp.obj:
    echo $(CXXFLAGS) >$*.OPT
    $(CXX) /Fo$@ @$*.OPT $*.CPP >$*.ERR
    TYPE $*.ERR

yy_lol.lib: $(OBJECTS)
    -$(RM) $@
    -$(AR) /out:$@ $(ARFLAGS) \yxx\lib.vc\yy_asrt.obj
    -$(AR) $@ $(ARFLAGS) \yxx\lib.vc\yy_ast.obj
    -$(AR) $@ $(ARFLAGS) \yxx\lib.vc\yy_bktrk.obj
    -$(AR) $@ $(ARFLAGS) \yxx\lib.vc\yy_buf.obj
    -$(AR) $@ $(ARFLAGS) \yxx\lib.vc\yy_sym.obj

1 Ответ

2 голосов
/ 23 января 2020

Как вы заметили, lib c как таковая отсутствует: это зависит от модели связи, с которой вы работаете

  • Однопоточная (не существует с VS10 и далее)
  • Однопоточная отладка (не существует начиная с VS10)
  • Многопоточная
  • Многопоточная отладка
  • Многопоточная DLL
  • Многопоточная отладочная DLL

Он подбирает другую библиотеку c в зависимости от используемой модели. Предполагается, что lib c взята из однопоточной модели (без отладки), которой больше не существует.

Для той же функциональности попробуйте использовать libcmt.lib - многопоточную версию без отладки.

...