【问题标题】:Undefined reference to `__ms_vsnprintf' when linking GLFW statically静态链接 GLFW 时对“__ms_vsnprintf”的未定义引用
【发布时间】:2015-03-22 20:53:30
【问题描述】:

我正在尝试使用 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

【问题讨论】:

  • 我通过自己编译 GLFW 库解决了这个问题。我仍然不知道为什么会这样。

标签: c++ mingw glfw win64


【解决方案1】:

当我尝试为 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 构建的。

【讨论】:

    【解决方案2】:

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

    所以只需在它们前面加上下划线。

    【讨论】:

      【解决方案3】:

      我在使用--host=i686-w64-mingw32 在 Linux for Windos32 上交叉编译 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 的调用的包装。因此也应该对构建系统进行 hack,并在某处注入 -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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-24
        • 2011-03-14
        相关资源
        最近更新 更多