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
4

6 回答 6

5

这是来自 MinGW 项目管理员的权威答案。

您的问题出现是因为您继续使用过时的(不再维护;不再支持)GCC 版本。当前版本mingwrt是使用 GCC-4.x 编译的,(我使用 GCC-4.8.2mingwrt-3.21及其后代),这引入了对__chkstk_ms, 的依赖关系(由libgccGCC-4.x 特定库提供,它与 GCC-3.x 不兼容)。

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

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

于 2015-06-13T08:23:01.377 回答
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

砰!

解决方案2:

mingw-get upgrade "mingwrt=3.18.*"

最后一个似乎与 gcc-v3-g++ 一起工作的。

于 2014-04-15T10:48:18.643 回答
1

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

于 2020-01-20T20:32:38.187 回答
0

我有一个类似的问题,这是因为我愚蠢地将新版本安装到旧安装中。修复很明显,我备份了旧安装,然后将其删除并重新安装。一切都编译得很完美。我猜旧习惯很难改掉。;)

于 2015-12-30T03:21:37.633 回答
-2

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

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

于 2020-10-23T02:10:15.240 回答
-5
  • 要编译 .cpp 文件,您必须发出以下命令才能对其进行编译。我建议你使用 gcc 而不是 g++,它们都可以工作。
  • gcc -c 测试.cpp -o 测试.exe
  • 或者用 g++
  • g++ -c 测试.cpp -o 测试.exe
于 2013-09-06T04:16:34.963 回答