随机无法parsing的外部符号,不应该在那里

我习惯于编译Linux,所以这个.lib的东西对我来说有点奇怪。 随着Visual Studio下我的程序,我不断得到其他库,甚至微软运行时的无法parsing的外部符号。

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 

凭借其inheritance的价值:

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

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

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

谢谢,Boncey

问题是你的glfw静态库是用不同于你正在使用的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 。 如果你想支持的不仅仅是windows,你将不得不有条件地在这个文件中定义你想要的选项。 所有选项在src/glfw_config.h.in都有描述。
  5. 将所有相关的文件添加到Visual Studio项目。
  6. 在项目选项中,将配置类型设置为静态库。 在C / C ++>常规下,确保SDL检查被禁用。 在预处理器下,将_GLFW_USE_CONFIG_H添加到定义中。
  7. 设置你的主项目依赖于GLFW项目(在右键菜单中)。 最后,将正确的GLFW库添加到链接器依赖项中。 (我有GLFW的输出目录设置,所以正确的lib只是$(SolutionDir)GLFW\$(Platform)\$(Configuration)\glfw.lib 。)

你也可以添加一个额外的库到你的链接器输入,即legacy_stdio_definitions.lib

进入“属性”>“链接器”>“输入”。

在其他依赖项中添加上面提到的库。

它看起来像动态和静态运行时库链接之间有一个错误的连接。 符号上的“__imp”前缀表示代码正在从DLL中寻找某些东西,但链接的库可能需要静态运行时库。

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