如何解决-------未定义的对'__chkstk_ms'的引用-------在明格
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: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
- 没有找到相关文章