如何解决-------未明确引用`__chkstk_ms'------- on mingw

时间:2013-09-06 02:58:56

标签: c++ linker g++ 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

6 个答案:

答案 0 :(得分:3)

关于链接旧库的原始问题似乎已经解决,但我的情况相反。 我需要使用较旧的GCC 3.4版本,所以我安装了gcc-v3-core软件包。 然后在链接一个普通的源时立即出现orig错误。 我发现MinGW GCC 3.4无法使用mingwrt&gt; 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 ++一起使用。

答案 1 :(得分:3)

这是来自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安装中,我可以重现您的问题。出于同样的原因,如果我使用相同版本的GCC 构建它,我也可以成功地将mingwrt-3.21.1与GCC-3.4.5,一起使用。

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

答案 2 :(得分:0)

我遇到了类似的问题,因为我愚蠢地将旧版本安装到旧版本中。修复是显而易见的,我备份了我的旧安装,然后删除它并完成了全新安装。一切都编译得很完美。我觉得老习惯很难。 ;)

答案 3 :(得分:0)

这可能是对原始问题的“现代”答案:您可能会错过MinGW中的stdc ++和gcc库,必须自己手动链接它们。

答案 4 :(得分:-1)

只需在Windows XP中安装并运行GCC。

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

答案 5 :(得分:-4)

  • 要编译.cpp文件,您必须发出以下命令才能进行编译。我建议你使用gcc而不是g ++,它们都可以工作。
  • gcc -c Test.cpp -o Test.exe
  • 或使用g ++
  • g ++ -c Test.cpp -o Test.exe