我正在尝试使用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 -lglew32s
,GLEW_STATIC
已定义。
答案 0 :(得分:2)
当我尝试为GLFW构建示例应用程序时,我遇到了同样的问题。我将编译器套件从原来的MinGW32切换到MinGW-W64,这解决了这个问题。读完这篇文章后,我提出了这个想法:
似乎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