簡體   English   中英

如何解決 -------undefined reference to `__chkstk_ms'-------on mingw

[英]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 中一切正常。

  • 要編譯 .cpp 文件,您必須發出以下命令進行編譯。 我建議你使用 gcc 而不是 g++,它們都可以工作。
  • gcc -c Test.cpp -o Test.exe
  • 或者用 g++
  • g++ -c Test.cpp -o Test.exe

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM