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

Random unresolved external symbols that shouldn't be there

本文关键字:外部 符号 存在 随机 不应该      更新时间:2023-10-16

我习惯于为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.0VClibOLDNAMES.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

我可以确认这是确切的订单。我试过安装和重新安装Windows7 SDK和Visual Studio,我也在Windows7上。

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

谢谢,Boncey

您还可以向链接器输入添加一个附加库,即legacy_stdio_definitions.lib

转到"属性">"链接器">"输入"。

在AdditionalDependencies中添加上述库。

问题是您的glfw静态库是使用与您使用的Visual Studio版本不同的Visual Studio构建的。截至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。如果您想要支持的不仅仅是窗口,那么您必须有条件地在此文件中定义您想要的选项。src/glfw_config.h.in中描述了所有选项
  5. 将所有相关文件添加到Visual Studio项目中
  6. 在项目选项中,将"配置类型"设置为static-lib。在"C/C++">"常规"下,确保"SDL检查"处于禁用状态。在"预处理器"下,将_GLFW_USE_CONFIG_H添加到定义中
  7. 将主项目设置为依赖于GLFW项目(在右键单击菜单中)。最后,将正确的GLFW-lib添加到链接器依赖项中。(我已经设置了GLFW的输出目录,所以正确的lib只是$(SolutionDir)GLFW$(Platform)$(Configuration)glfw.lib。)

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

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