[英]How to solve -------undefined reference to `__chkstk_ms'-------on mingw
我剛剛在 mingw 上安裝了 gcc 和 g++。 我編寫了一個非常簡單的“hello world”程序來測試 g++ 編譯器是否工作。 代碼:
#include <iostream>
using namespace std;
int main()
{
cout << "hello world" << endl;
return 0;
}
編譯:
g++ Test.cpp
然后出現一些錯誤:
D:/MinGW[Finished in 0.6s with exit code 1]/bin/../lib/gcc/mingw32/3.4.5/../../../../mingw32/lib/crt2.o: In function `_mingw_setargv':
D:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../mingw32/lib/libmingwex.a(glob.o): In function `glob_match':
i:\p\giaw\src\pkg\mingwrt-4.0-1-mingw32-src\bld/../mingwrt-4.0.0-1-mingw32-src/src/libcrt/misc/glob.c:733: undefined reference to `__chkstk_ms'
D:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../mingw32/lib/libmingwex.a(glob.o): In function `glob_strdup':
i:\p\giaw\src\pkg\mingwrt-4.0-1-mingw32-src\bld/../mingwrt-4.0.0-1-mingw32-src/src/libcrt/misc/glob.c:85: undefined reference to `__chkstk_ms'
D:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../mingw32/lib/libmingwex.a(glob.o): In function `glob_match':
i:\p\giaw\src\pkg\mingwrt-4.0-1-mingw32-src\bld/../mingwrt-4.0.0-1-mingw32-src/src/libcrt/misc/glob.c:841: undefined reference to `__chkstk_ms'
D:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../mingw32/lib/libmingwex.a(glob.o): In function `glob_strdup':
i:\p\giaw\src\pkg\mingwrt-4.0-1-mingw32-src\bld/../mingwrt-4.0.0-1-mingw32-src/src/libcrt/misc/glob.c:85: undefined reference to `__chkstk_ms'
D:/MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../mingw32/lib/libmingwex.a(glob.o):i:\p\giaw\src\pkg\mingwrt-4.0-1-mingw32-src\bld/../mingwrt-4.0.0-1-mingw32-src/src/libcrt/misc/glob.c:85: more undefined references to `__chkstk_ms' follow
collect2: ld returned 1 exit status
這是來自 MinGW 項目管理員的權威答案。
您的問題出現是因為您繼續使用過時的(不再維護;不再支持)GCC 版本。 當前版本的mingwrt
是使用 GCC-4.x 編譯的(我將 GCC-4.8.2 用於mingwrt-3.21
及其后代),這引入了對__chkstk_ms
的依賴(由libgcc
提供——一個 GCC-4 .x 特定庫,與 GCC-3.x 不兼容)。
FWIW,如果我將 GCC-4.8.2 內置的mingwrt-3.21.1
安裝到 GCC-3.4.5 安裝中,我可以重現您的問題。 mingwrt-3.21.1
同樣的mingwrt-3.21.1
,如果我使用相同版本的 GCC 構建它,我也可以成功地將mingwrt-3.21.1
與 GCC-3.4.5一起使用。
因此,對於權威答案:如果您必須繼續使用過時的 GCC 版本,您需要准備好使用相同的過時編譯器重建所有關聯的庫。
關於鏈接舊庫的原始問題似乎已解決,但我有相反的情況。 我需要使用較舊的 GCC 3.4 版本,所以我安裝了 gcc-v3-core 包。 然后在鏈接一個微不足道的源時立即出現原始錯誤。 我發現 MinGW GCC 3.4 不能與 mingwrt > 3.20 一起工作,問題是 gcc-v3-core 包含不正確的 mingwrt 規范,允許最新版本。
解決方法很簡單:
mingw-get upgrade "mingwrt=3.20.*"
!更新! 實際上使用 mingwrt-3.20 鏈接器報告 C++ 代碼的相同錯誤:
g++ hello.cpp
砰!
解決方案2:
mingw-get upgrade "mingwrt=3.18.*"
最后一個似乎適用於 gcc-v3-g++ 的。
這可能是原始問題的“現代”答案:您可能會錯過 MinGW 中的 stdc++ 和 gcc 庫,必須自己手動鏈接它們。
我遇到了類似的問題,這是因為我愚蠢地將新版本安裝到舊安裝中。 修復很明顯,我備份了舊安裝,然后將其刪除並重新安裝。 一切都完美編譯。 我猜舊習慣很難改掉。 ;)
只需在 Windows XP 中安裝並運行 GCC。
我在 Windows_10_x64_b1607 和 Windows_XP_SP3 中測試了完全相同的 MinGW 二進制文件(基於 GCC-3.4.5)。 Windows 10 生成__chkstk_ms
錯誤,但在 Windows XP 中一切正常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.