不应该存在的随机未解析外部符号

Random unresolved external symbols that shouldn't be there

我习惯于为 Linux 编译,所以这个 .lib 东西对我来说有点奇怪。我的程序在 Visual Studio 下,我一直在为其他库甚至 Microsoft 运行时获取随机未解析的外部符号。

1>glfw3.lib(init.c.obj) : error LNK2019: unresolved external symbol __imp__vsnprintf referenced in function __glfwInputError
1>MSVCRTD.lib(vsnprintf.obj) : error LNK2001: unresolved external symbol __imp__vsnprintf
1>glfw3.lib(context.c.obj) : error LNK2019: unresolved external symbol __imp__sscanf referenced in function _parseVersionString
1>MSVCRTD.lib(vsnprintf.obj) : error LNK2001: unresolved external symbol __imp___vsnprintf
1>C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\lib\OLDNAMES.lib : warning LNK4272: library machine type 'UNKNOWN' conflicts with target machine type 'X86'

我只包含这些库,我可以确认它们已被找到:

x86/glew32s.lib
x86/glfw3.lib
x86/glfw3dll.lib
opengl32.lib

他们继承的价值观:

kernel32.lib
user32.lib
gdi32.lib
winspool.lib
comdlg32.lib

我可以确认这是正确的顺序。我已经尝试安装和重新安装 Windows 7 SDK 和 Visual Studio - 我也在 Windows 7.

如有任何关于此问题的帮助,我们将不胜感激,如果需要,我很乐意提供更多信息。

谢谢,邦西

看起来动态和静态运行时库链接之间存在错误连接。符号上的“__imp”前缀表示您的代码正在从 DLL 中查找某些内容,但您链接的库可能需要静态运行时库。

调出项目 属性 页面(在 Build->Properties 下),然后在左侧查找 C++ 类别。在 "Code Generation" 下应该有一个名为 "Runtime Library" 的条目。这可能当前设置为多线程调试 DLL (/MDd),因为它看起来像是在调试模式下编译。将其更改为多线程调试 (/MTd),然后重新编译所有内容。看看现在是否有效。

问题是您的 glfw 静态库是使用与您正在使用的版本不同的 Visual Studio 版本构建的。截至 spring 2015,glfw.org 上的预建版本与 Visual Studio 2015 RC(您似乎正在使用)不兼容。

幸运的是,GLFW 是一个在宽松许可下发布的小型代码库,因此最简单的解决方案就是在您的解决方案中为其创建一个新项目。这些步骤将是这样的:

  1. 在您的解决方案中创建一个新的空项目 GLFW。
  2. 复制到 includedeps/GL,并创建一个 src 文件夹。
  3. 将所有源文件复制到您打算支持的平台的 src 文件夹中。对于 windows,这是带有 winwgl 前缀或没有前缀的所有内容。你可以忽略所有 cmake 的东西。
  4. src 中创建名为 glfw_config.h 的文件,其中包含 _GLFW_WIN32_GLFW_WGL_GLFW_USE_OPENGL#defines。如果您想要支持的不仅仅是 windows,您必须有条件地在此文件中定义您想要的选项。 src/glfw_config.h.in.
  5. 中描述了所有选项
  6. 将所有相关文件添加到 Visual Studio 项目。
  7. 在项目选项中,将配置类型设置为静态库。在 C/C++ > 常规下,确保禁用 SDL 检查。在预处理器下,将 _GLFW_USE_CONFIG_H 添加到定义中。
  8. 将您的主项目设置为依赖于 GLFW 项目(在右键单击菜单中)。最后,将正确的 GLFW 库添加到链接器依赖项中。 (我设置了 GLFW 的输出目录,所以正确的库只是 $(SolutionDir)GLFW$(Platform)$(Configuration)\glfw.lib。)

您还可以向链接器输入添加额外的库,即 legacy_stdio_definitions.lib

转到“属性”>“链接器”>“输入”。

并在附加依赖项中添加上述库。