如何解决-------未定义的对'__chkstk_ms'的引用-------在明格

How to solve -------undefined reference to `__chkstk_ms'-------on mingw

本文关键字:------- chkstk ms 引用 何解决 解决 未定义      更新时间:2023-10-16

我刚刚在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:pgiawsrcpkgmingwrt-4.0-1-mingw32-srcbld/../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:pgiawsrcpkgmingwrt-4.0-1-mingw32-srcbld/../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:pgiawsrcpkgmingwrt-4.0-1-mingw32-srcbld/../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:pgiawsrcpkgmingwrt-4.0-1-mingw32-srcbld/../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:pgiawsrcpkgmingwrt-4.0-1-mingw32-srcbld/../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 编译的(我对 mingwrt-3.21 及其后代使用了 GCC-4.8.2),这引入了对 __chkstk_ms 的依赖关系(由 libgcc 提供 - GCC-4.x 特定的库,与 GCC-3.x 不兼容)。

FWIW,如果我将 GCC-4.8.2 内置mingwrt-3.21.1安装到 GCC-3.4.5 安装中,我可以重现您的问题。出于同样的原因,如果我使用相同版本的 GCC 构建它,我也可以成功地将mingwrt-3.21.1与 GCC-3.4.5 一起使用。

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

关于链接到旧库的原始问题似乎已经解决,但我的情况恰恰相反。我需要使用较旧的GCC 3.4版本,所以我安装了gcc-v3核心软件包。然后,在链接琐碎的源时,原始错误会立即出现。我发现 MinGW GCC 3.4 无法与 mingwrt> 3.20 一起使用,问题是 gcc-v3-core 包含不正确的 mingwrt 规范,允许最新的 vesion。

解决方案很简单:

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 测试.cpp -o 测试.exe
  • 或者使用 g++
  • g++ -c Test.cpp -o Test.exe
相关文章:
  • 没有找到相关文章