繁体   English   中英

静态链接 GLFW 时对“__ms_vsnprintf”的未定义引用

[英]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 并解决了问题。 看完这篇文章后,我想到了这个想法:

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

似乎 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM