[英]Undefined reference to `__ms_vsnprintf' when linking GLFW statically
我正在尝试使用 mingw 在 Windows 8 64 位中编译 GLFW 快速入门指南(此处)。 我正在使用 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
定义了GLEW_STATIC
。
当我尝试为 GLFW 构建示例应用程序时,我遇到了同样的问题。 我将编译器套件从原始 MinGW32 切换到 MinGW-W64 并解决了问题。 看完这篇文章后,我想到了这个想法:
似乎 GLFW 库是用 MinGW64 或 MinGW-W64 构建的。
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);
所以只需在它们前面使用下划线即可。
我在使用--host=i686-w64-mingw32
在 Linux 上为 Windos32 交叉编译GMP时遇到了这个问题。
因为我不想弄乱 GMP 的源代码或构建系统,而且我无法选择在 Windos32 上使用什么工具链,
我想出了以下解决方法:链接时,链接
-Wl,-u,___mingw_vsnprintf -Wl,--defsym,___ms_vsnprintf=___mingw_vsnprintf
无论如何,我更喜欢 C99 兼容版本。 请注意, ___mingw_vsnprintf
,变通方法都会拖拽___mingw_vsnprintf
,即即使在目标代码不使用vsnprintf
的情况下。
mingw 版本由libmingwex.a
提供; 您会看到 gcc 与-lmingwex
-Wl,-v
链接-Wl,-v
它打印-lmingwex
(以及许多其他内容)。
问题可能是项目的配置存在一些问题,无法确定主机的vsnprintf
是否正常工作,或者用户是否想要坚持使用符合 C99 的 MS 内容或功能。 无论如何, stdio.h
的我的i686-W64-mingw32的交叉工具以及在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
。
在 autotools 的情况下,在 GMP 的情况下对我有用的是配置
$(srcdir)/configure CPPFLAGS='-D__USE_MINGW_ANSI_STDIO' ...
重新配置、构建和安装后, nm libgmp.a | grep vsnprintf
nm libgmp.a | grep vsnprintf
显示构建的库
U ___mingw_vsnprintf
而不是以前的
U ___ms_vsnprintf
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.