如何解决在MinGW上出现的"-------undefined reference to `__chkstk_ms'-------"问题

4
我刚刚在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

3
似乎存在一个版本冲突,mingw32/3.4.5/mingwrt-4.0-1不兼容。看起来您正在链接到旧的库3.4.5 - Jesse Good
但是我已经通过MinGW安装管理器升级了mingw。我如何知道mingwrt的版本?谢谢! - YuChan
就像你所说的那样,我发现这是一个版本冲突问题。当我检查我已安装的软件包时,我发现我不小心添加了旧版本(2006年版)的gcc和g++。然后我卸载它们并安装了当前版本的gcc和g++,我的问题得到了解决。再次感谢。 - YuChan
很棒的想法,伙计们。在SO上互相交流不会引起任何可能真正采取行动解决问题的人的注意;你需要通过http://mingw.org上记录的流程提出问题。 - Keith Marshall
我们正在使用gcc 7.4,并遇到了这个错误... - Erik Aronesty
如果将来有任何谷歌员工遇到和我相同的问题,我对-fshort-double选项有一个严格的要求,该选项最后一次出现并正常工作是在GCC 4.5.2中。似乎w32api 3.15-1和mingwrt 3.18是能够与该版本的GCC正确配合运行的神奇版本。 - Aaron Christiansen
6个回答

5

以下为MinGW项目管理员的权威答案。

您遇到的问题是因为您继续使用已经过时的(不再维护;不再支持)GCC版本。当前版本的mingwrt使用GCC-4.x编译(我使用GCC-4.8.2 for mingwrt-3.21及其后继版本),这导致与__chkstk_ms的依赖关系(由libgcc提供 - 这是一个GCC-4.x特定的库,与GCC-3.x不兼容)。

对于您的问题,如果我将使用GCC-4.8.2构建的mingwrt-3.21.1安装到GCC-3.4.5中,我可以复现您的问题。同样地,如果我使用相同版本的GCC构建mingwrt-3.21.1,则我也可以成功地在GCC-3.4.5上使用它。

因此,权威答案是:如果您必须继续使用过时的GCC版本,则需要准备好使用相同的过时编译器重新构建所有相关库。


3

原始问题似乎已经解决了,涉及旧库的链接,但我的情况相反。

我需要使用较旧版本的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

BAM!

解决方案2:

mingw-get upgrade "mingwrt=3.18.*"

似乎只有最后一个能与gcc-v3-g++兼容。

顺便说一句:关于MinGW GCC 3.4安装的所有信息都已经过时/不完整。我不得不自己尝试包。一个非常重要的事情是:gcc-v3需要libgcc,而MinGW/Base/gcc/Version3中没有提供,也没有在gcc-v3中提供。必须从Version4获取它。 - koczis
如果您正在使用来自GCC-4.x的libgcc以及GCC-3.x编译器,则会遇到一些大麻烦——两者不打算一起工作,并且在根本上不兼容。GCC-3.x不需要任何未提供的GCC库。您看到此依赖项表明您正在将已使用GCC-4.x编译的其他库混合到GCC-3.x工具链中;您需要使用GCC-3.x重新编译这些库。 - Keith Marshall
很抱歉打破你的幻想,但这不是一个解决方案!如果你必须使用一个古老、过时且长期不受支持的GCC版本(为什么?),那么解决方案就是确保你使用的每个库都已经用同样过时的GCC版本编译。当然,这变得越来越难以确保,除非你自己投入精力从源代码构建每一个库。 - Keith Marshall

1
这可能是对原问题的“现代”回答:你可能会在MinGW中错过stdc++和gcc库,必须手动链接它们。

0
我曾经遇到过类似的问题,是因为我愚蠢地将新版本安装到旧版中。解决方法很明显,我备份了旧版,然后删除它并进行了全新安装。一切都编译得非常完美。我想老习惯难改吧。 ;)

-1

在Windows XP中安装并运行GCC即可。

我在Windows_10_x64_b1607和Windows_XP_SP3上测试了完全相同的MinGW二进制文件(基于GCC-3.4.5)。 Windows 10会生成__chkstk_ms错误,但在Windows XP中一切正常。


-5
要编译一个 .cpp 文件,您需要发出以下命令进行编译。我建议您使用 gcc 而不是 g++,它们都可以按照任何方式工作。
gcc -c Test.cpp -o Test.exe 或者使用 g++
g++ -c Test.cpp -o Test.exe

“gcc --help”显示:“-c 编译和汇编,但不链接”。而“-o <file> 将输出放入<file>”。“所以你的“解决方案”是构建一个没有链接的目标文件并将其重命名!” - Aerospace
1
@Aerospace,事实上这个所谓的解决方案根本就不是什么解决方案——它完全是误导性的,而且彻底错误!一定要使用分离编译和链接,使用g++ -c test.cpp进行第一步,然后使用g++ -o test.exe test.o。此外,虽然在第一步中可以使用gcc -c test.cpp,但这并不被推荐;对于第二步,它完全不适用。 - Keith Marshall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接