簡體   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