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

时间:2015-04-10 08:03:11

标签: c++ windows visual-studio linker symbols

我以前用于编译Linux,所以这个.lib的东西对我来说有点奇怪。使用Visual Studio下的程序,我不断为其他库甚至Microsoft Runtimes获取随机未解析的外部符号。

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上。

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

谢谢,Boncey

3 个答案:

答案 0 :(得分:18)

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

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

在Additional Dependencies中添加上面提到的库。

答案 1 :(得分:9)

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

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

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

答案 2 :(得分:0)

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

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