[英]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.