C++:Visual Studio 2015 中未解析的外部符号 _sprintf 和 _sscanf

Posted

技术标签:

【中文标题】C++:Visual Studio 2015 中未解析的外部符号 _sprintf 和 _sscanf【英文标题】:C++: Unresolved external symbol _sprintf and _sscanf in Visual Studio 2015 【发布时间】:2015-09-06 00:00:04 【问题描述】:

对于一个研究项目,我正在为科学计算语言编写 C++ 插件。不幸的是,允许用户执行此操作的库并没有很好地保持最新状态。

我在 XCode 中启动了这个项目,在那里它构建得很好。后来我不得不搬到PC上,所以我将代码迁移到Visual Studio 2015。由于这样做,由于以下错误,我一直无法构建:

LNK2001 : unresolved external symbol _sprintf
LNK2019 : unresolved external symbol _sscanf referenced in function _GetDDouble
LNK2019 : unresolved external symbol _sprintf referenced in function _CheckRunningInMainThread

尝试的修复是添加标题#define _CRT_SECURE_NO_WARNINGS。但是,这 a) 没有修复任何错误,并且 b) 添加了警告 C4005 : '_CRT_SECURE_NO_WARNINGS': macro redefinition。我假设库已经定义了这个宏,预料到了这个问题。无论如何,它并没有解决问题。

我应该如何进行?

【问题讨论】:

【参考方案1】:

将以下库添加到链接器输入文件:

legacy_stdio_definitions.lib

VS 2015 现在使用内联定义来调用许多stdio.h 函数的内部函数。如果目标文件(或库成员)依赖于其中一个函数,则 legacy_stdio_definitions.lib 提供可链接到的函数的外部可链接版本。

您的另一个选择是使用 VS 2015 重新编译依赖于这些函数的单元(这可能是首选选项)。

【讨论】:

@user4581301:你能详细说明一下吗? 对不起。支持,即使有包装,旧的 stdio 的东西,没有哭泣和呻吟。时不时地,snprintf 正是完成这项工作的正确工具,我讨厌不得不为应该在盒子里的东西做可移植性包装器。 @Epirocks:我自己还没有测试过——你在使用来自C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\amd64的库吗?您收到的确切错误消息有哪些? 不,x64 但最终错误来自已被供应商替换的单独库,所以请忽略我所说的,谢谢。 您还可以将:#pragma comment (lib, "legacy_stdio_definitions.lib") 添加到源文件之一中,以便链接器也添加它。【参考方案2】:

我在针对版本 5 max sdk(纯 c api)编译循环 max 插件时遇到此错误。遗留库修复对我不起作用(它应该有,如果有人知道为什么我可能不好奇),但我在加载 stdio 之前定义了 _NO_CRT_STDIO_INLINE 并且确实起到了作用。

【讨论】:

【参考方案3】:

我最近遇到了这个问题,并且能够将 User32.lib 添加到链接器 > 输入 > 附加依赖项。

您还可以在代码中包含#pragma comment (lib, "User32.lib")

【讨论】:

以上是关于C++:Visual Studio 2015 中未解析的外部符号 _sprintf 和 _sscanf的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio/CMake 中未解析的外部符号 cuda_library::foo(int)

C++学习---Visual Studio 2015 C++使用教程

Visual Studio 2015 不能使用 C++

在 Microsoft Visual Studio 2015 的 C++ 项目中包含 Armadillo C++ 库

加载 Visual Studio 2015 C++ 项目时出错,如何调试

Visual Studio 2015 Update 1 中的 C++ 内部编译器错误