未定义的引用`__ms_vsnprintf'当静态链接GLFW时

时间:2015-03-22 20:53:30

标签: c++ mingw glfw win64

我正在尝试使用mingw在Windows 8 64位中编译GLFW快速入门指南(Here)。我正在使用glfw网站上的官方32位Windows二进制文件。

通过链接-lglfw3dll -lgdi32 -lopengl32 -lglew32和定义GLFW_DLL动态链接glfw库,一切正常。

但是,当我尝试静态链接glfw时,我得到undefined reference to '__ms_vsnprintf'

我的静态链接命令是mingw32-g++.exe -o bin\Release\test.exe obj\Release\main.o -s -lglfw3 -lgdi32 -lopengl32 -lglew32sGLEW_STATIC已定义。

3 个答案:

答案 0 :(得分:2)

当我尝试为GLFW构建示例应用程序时,我遇到了同样的问题。我将编译器套件从原来的MinGW32切换到MinGW-W64,这解决了这个问题。读完这篇文章后,我提出了这个想法:

http://mingw-users.1079350.n2.nabble.com/missing-symbol-ms-vsnprintf-when-linking-with-cross-compiled-library-td7582798.html

似乎GLFW库是使用MinGW64或MinGW-W64构建的。

答案 1 :(得分:1)

MinGW\include\stdio.h

/* The following pair ALWAYS refer to the MSVCRT implementations...
 */
_CRTIMP int __cdecl __MINGW_NOTHROW _snprintf (char*, size_t, const char*, ...);
_CRTIMP int __cdecl __MINGW_NOTHROW _vsnprintf (char*, size_t, const char*, __VALIST);
_CRTIMP int __cdecl __MINGW_NOTHROW _vscprintf (const char*, __VALIST);

所以只需在它们前面使用下划线。

答案 2 :(得分:1)

在Linux for Windos32上将--host=i686-w64-mingw32交叉编译GMP时遇到了这个问题。

由于我不想弄乱GMP的源代码或构建系统,而且我别无选择,只能在Windos32上使用哪种工具链,

我想出了以下解决方法:链接时,链接

-Wl,-u,___mingw_vsnprintf -Wl,--defsym,___ms_vsnprintf=___mingw_vsnprintf

无论如何,我更喜欢C99兼容版本。请注意,无论如何,即使在目标代码不使用___mingw_vsnprintf的情况下,这种解决方法也会拖累vsnprintf

mingw版本由libmingwex.a提供;您会看到gcc与-Wl,-v链接,并显示-lmingwex(还有许多其他内容)。

问题可能是项目的配置在确定主机的vsnprintf是否正常工作,或者用户是否要坚持使用符合C99的MS内容或功能时遇到了一些问题。无论如何,我的i686-w64-mingw32交叉工具中的stdio.h以及主机上的stdio.h都具有受

保护的部分。
#if __USE_MINGW_ANSI_STDIO
/*
 * User has expressed a preference for C99 conformance...
 */
...
#ifdef _GNU_SOURCE

,然后将vsnprintf定义为对__mingw_vsnprintf的调用或对__ms_vsnprintf的调用的包装。因此,构建系统也应该受到黑客攻击,并在某处注入-D__USE_MINGW_ANSI_STDIO

对于自动工具,对于GMP,对我有用的是配置

$(srcdir)/configure CPPFLAGS='-D__USE_MINGW_ANSI_STDIO' ...

重新配置,构建和安装后,nm libgmp.a | grep vsnprintf会显示已构建的库

         U ___mingw_vsnprintf

代替上一个

         U ___ms_vsnprintf