链接 GLFW 静态库时出现“Undefined reference to `__ms_vsnprintf'”错误。

3
我正在尝试使用mingw在Windows 8 64位操作系统上编译GLFW快速入门指南(点击这里)。我正在使用glfw网站提供的官方32位Windows二进制文件。当我链接glfw库动态库时,通过链接-lglfw3dll -lgdi32 -lopengl32 -lglew32并定义GLFW_DLL,一切正常。
然而,当我尝试静态链接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

我通过自己编译GLFW库解决了这个问题,但仍不知道为什么会发生这种情况。 - NoviceCodingGeek
4个回答

3

1

当我在Linux上使用--host=i686-w64-mingw32交叉编译GMP时,遇到了问题。

由于我不想干扰GMP的源码或构建系统,并且在Windos32上使用哪种工具链也没有选择,因此需要解决这个问题。

I figured out the following work-around: When linking, link with

-Wl,-u,___mingw_vsnprintf -Wl,--defsym,___ms_vsnprintf=___mingw_vsnprintf
我更喜欢符合C99标准的版本。请注意,无论如何,这种解决方法都会拖慢___mingw_vsnprintf,即使目标代码没有使用vsnprintf。
mingw版本由libmingwex.a提供;你可以看到gcc使用-Wl,-v链接它,其中包括-lmingwex(以及许多其他内容)。
问题可能是项目的配置有些问题,无法确定主机的vsnprintf是否正常工作,或者用户是否想要坚持使用MS的东西或符合C99标准的函数。无论如何,我的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

对于autotools,在GMP的情况下适用的方法是配置。

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

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

         U ___mingw_vsnprintf

替代之前的

         U ___ms_vsnprintf

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);

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


1
我知道这个话题很旧,但在我的情况下解决方法是运行make clean && make来删除使用不兼容版本的GCC编译的旧目标文件(.o)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接