不应该存在的随机未解析外部符号
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 是一个在宽松许可下发布的小型代码库,因此最简单的解决方案就是在您的解决方案中为其创建一个新项目。这些步骤将是这样的:
- 在您的解决方案中创建一个新的空项目 GLFW。
- 复制到
include
、deps/GL
,并创建一个 src
文件夹。
- 将所有源文件复制到您打算支持的平台的
src
文件夹中。对于 windows,这是带有 win
或 wgl
前缀或没有前缀的所有内容。你可以忽略所有 cmake 的东西。
- 在
src
中创建名为 glfw_config.h
的文件,其中包含 _GLFW_WIN32
、_GLFW_WGL
和 _GLFW_USE_OPENGL
的 #defines
。如果您想要支持的不仅仅是 windows,您必须有条件地在此文件中定义您想要的选项。 src/glfw_config.h.in
. 中描述了所有选项
- 将所有相关文件添加到 Visual Studio 项目。
- 在项目选项中,将配置类型设置为静态库。在 C/C++ > 常规下,确保禁用 SDL 检查。在预处理器下,将
_GLFW_USE_CONFIG_H
添加到定义中。
- 将您的主项目设置为依赖于 GLFW 项目(在右键单击菜单中)。最后,将正确的 GLFW 库添加到链接器依赖项中。 (我设置了 GLFW 的输出目录,所以正确的库只是
$(SolutionDir)GLFW$(Platform)$(Configuration)\glfw.lib
。)
您还可以向链接器输入添加额外的库,即 legacy_stdio_definitions.lib
转到“属性”>“链接器”>“输入”。
并在附加依赖项中添加上述库。
我习惯于为 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 是一个在宽松许可下发布的小型代码库,因此最简单的解决方案就是在您的解决方案中为其创建一个新项目。这些步骤将是这样的:
- 在您的解决方案中创建一个新的空项目 GLFW。
- 复制到
include
、deps/GL
,并创建一个src
文件夹。 - 将所有源文件复制到您打算支持的平台的
src
文件夹中。对于 windows,这是带有win
或wgl
前缀或没有前缀的所有内容。你可以忽略所有 cmake 的东西。 - 在
src
中创建名为glfw_config.h
的文件,其中包含_GLFW_WIN32
、_GLFW_WGL
和_GLFW_USE_OPENGL
的#defines
。如果您想要支持的不仅仅是 windows,您必须有条件地在此文件中定义您想要的选项。src/glfw_config.h.in
. 中描述了所有选项
- 将所有相关文件添加到 Visual Studio 项目。
- 在项目选项中,将配置类型设置为静态库。在 C/C++ > 常规下,确保禁用 SDL 检查。在预处理器下,将
_GLFW_USE_CONFIG_H
添加到定义中。 - 将您的主项目设置为依赖于 GLFW 项目(在右键单击菜单中)。最后,将正确的 GLFW 库添加到链接器依赖项中。 (我设置了 GLFW 的输出目录,所以正确的库只是
$(SolutionDir)GLFW$(Platform)$(Configuration)\glfw.lib
。)
您还可以向链接器输入添加额外的库,即 legacy_stdio_definitions.lib
转到“属性”>“链接器”>“输入”。
并在附加依赖项中添加上述库。