MSVC 2019:遗留库中的 libc 外部未解决

Posted

技术标签:

【中文标题】MSVC 2019:遗留库中的 libc 外部未解决【英文标题】:MSVC 2019: libc externals in legacy library not resolved 【发布时间】:2020-05-16 16:39:12 【问题描述】:

我正在将旧版应用程序(最初使用 VC 6.0 编译)移植到 MSVC 2019。它使用使用 VC 6.0 编译的旧版静态库 (libtest.lib)。我的问题是 MSVC 2019 没有解决 libtest.lib 中的一些(但不是全部)标准 libc 函数。

例如,libtest.lib 使用 vsprintf()。在编译时,MSVC 2019 报告“unresolved external symbol _vsprintf referenced in ...”。其他 libc 函数(例如 strlen)都可以很好地解析。

我尝试过使用大量的构建设置,但没有任何乐趣。为什么会发生这种情况,我该如何解决?

到目前为止我的研究......

我在 VC60 标头中进行了大量挖掘,发现 vsprintf 在 studio.h 中定义为

_CRTIMP int __cdecl vsprintf(char *,const char *, va_list);

while strlen 在 string.h 中定义 作为

size_t  __cdecl strlen(const char *); 

我不确定其中的含义,但我猜 strlen 只是一个普通的静态函数,而 vsprintf 是从某个 CRT DLL(其中在 MSVC 2019 中可能有所不同)。

我想我也可以将 libtest.lib 移植到 MSVC 2019,但我还有近 100 个其他静态库,并且将它们全部移植将是一大难题。

【问题讨论】:

这能回答你的问题吗? Unresolved external symbol __vsnprintf .... (in dxerr.lib)? 哇,多么神奇的子弹!完美运行!谢谢。 Dewaffled:.将此作为答案发布,我会接受并为您提供一些巧克力蛋糕积分:) 【参考方案1】:

感谢@dewaffled 的出色回答: Microsoft 有一个库可以使 CRT 函数适应最新版本的 MSVC,例如 2019

只需将以下行添加到您的主程序中:

#pragma comment(lib, "legacy_stdio_definitions.lib")

或者,我认为您可以将库添加到:

Project Properties -> Linker -> Input -> Additional Dependencies  

【讨论】:

以上是关于MSVC 2019:遗留库中的 libc 外部未解决的主要内容,如果未能解决你的问题,请参考以下文章

只有 wWinMain MSVC 2019 的链接器错误无法解析外部符号

Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 获取 远程 目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 )

Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 三 | 等待远程函数执行完毕 | 寄存器获取返回值 )(代

Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 二 | 准备参数 | 远程调用 mmap 函数 )(代码片

Android 逆向Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 一 | mmap 函数简介 )

printf是在libc库中么?