使用std::string导致Windows出现“找不到入口点”的错误

7
当我使用G.C.C编译这个代码时:
#include <iostream>
#include <string>

int main()
{
    std::cout << std::string("\r\n");
    return 0;
}

通过使用下面的批处理文件:
g++ -Wall main.cc

尝试运行输出文件(a.exe),然后Windows以此错误崩溃初始化:

Run time error

如果我在C++代码中避免使用std::string, 即使包括<string>,它也可以正常执行。 有什么想法吗?

请注意,第一次测试std::string

我运行的是Windows 8 / 64位。 我的编译器包含这个文件build-info.txt

# **************************************************************************

version : MinGW-W64-builds-4.3.0
user    : nixman
date    : 03.30.2017- 1:01:08 PM
args    : --mode=gcc-6.3.0 --buildroot=/c/mingw630 --jobs=2 --rev=2 --threads=win32 --exceptions=sjlj --arch=i686 --bin-compress

[much more here...]

# **************************************************************************

请注意,我习惯于禁用和卸载所有可能的反病毒实用程序(例如Windows Defender)。


2
也许这个讨论可以帮到你:https://dev59.com/oV_Va4cB1Zd3GeqPS2Wn - Michaël Roy
2
您没有正确地链接运行库。另外,#include <string>不会生成任何代码。毫不奇怪的是,在不使用该头文件的情况下包含它不会显示您看到的错误。 - IInspectable
2
@Matheus -- 你的编译器安装有问题,或者你没有将正确的运行时库与编译器生成的目标代码链接起来。很可能会发现许多(如果不是全部)C++库功能无法正常工作,因此这不仅仅是std::string会出现问题。 - PaulMcKenzie
3
你可以下载Visual C++ Build Tools。这是一个完整的构建工具集,没有集成开发环境(IDE)。 - IInspectable
4
不要放弃C++,它是一种很棒的编程语言。对于小代码片段,在线编译器如http://coliru.stacked-crooked.com/可能会很有用。https://isocpp.org/上有很多好的阅读资料,或者可以寻找标题或大纲中带有“现代C ++”的书籍。 - Frank Boyne
显示剩余7条评论
1个回答

1

找到解决方案并不容易(zZZzzZzZzZz),但最终在this answer上找到了。

g++ -Wall -D_GLIBCXX_USE_CXX11_ABI=0 main.cc

2
这可能意味着您正在使用不匹配的gcc和glibc版本... 这样做是告诉它不要在调用glibc中的标准库实现时使用c++11名称重整... - jheriko
1
@jheriko 嗯,所以“名称修饰”就是将std::string转换为stdstring,是这样吗? - user5066707
1
不是。这是编译器如何编码符号的名称(函数、变量、类等),以便可以在库或跨编译单元中使用。gcc为C++ 11添加了不同的ABI,由此宏进行控制,并在某个时候启用默认值... https://zh.wikipedia.org/wiki/%E5%90%8D%E7%A7%B0%E7%BC%96%E7%A0%81 - jheriko
最好修复损坏的编译器安装,而不是使用这个解决方法。 - M.M

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