windows - 如何将旧的 Visual c++ 代码 (vc++ 6.0) 转换为 Visual Studio 2019,缺少 libc
问题描述
我有一些作为 CLI 应用程序运行并使用 nmake 文件构建的旧 Visual C++ (v 6.0) 代码,我想将其转换为我可以在 Visual Studio 2019 中构建的东西(在不在 IDE 下的 shell 窗口中)。它使用我类似构建的库。我的 makefile 将包含在底部。
我发现
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 的变体,但没有普通的 libc.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
解决方案
正如您所注意到的,没有这样的 libc:它取决于您正在使用的链接模型
- 单线程(从 VS10 开始不存在)
- 单线程调试(从 VS10 开始不存在)
- 多线程
- 多线程调试
- 多线程DLL
- 多线程调试 DLL
它会根据您使用的模型选择不同的 libc。猜测 libc 来自不再存在的单线程模型(非调试)。
对于相同的功能,请尝试使用 libcmt.lib - 多线程非调试版本。
推荐阅读
- react-native - react-native 中的设计时间线
- python - 在排序数组中搜索
- javascript - VueJS,使用 API 调用刷新组件
- c++ - 将声明从 char 更改为 int,使输出不同
- javascript - DataTables 表上的标题会折叠,直到发生某种重绘。有没有办法强制重新绘制标题或类似的东西?
- google-cloud-platform - 创建基于发布/订阅拉订阅的警报策略
- ruby-on-rails - Rails application.js:需要给定目录中的所有 js 文件
- python - 如何绘制图表以查看准确性
- javascript - 在 React-Redux 中计算总价格
- variables - 如何使用 Newman cli Companion 将 Azure DevOps 变量传递给 Postman 值?