【问题标题】:gcc 5.40 doesn't include standard include files?gcc 5.40 不包括标准包含文件?
【发布时间】:2017-11-26 09:08:45
【问题描述】:

gcc 5.4.0 赛格温 2.8.0 Win10

我一直在琢磨这个问题。当我编译一个简单的程序时,见下文,我在一个 gcc 包含文件中遇到错误。我检查了 cygwin 邮件列表,没有人报告 gcc 下载中的错误,所以我认为这是我的误解,但我不知道我做错了什么。在此之前,所有 gcc 包含文件都是自动包含的。哦,其他库的编译是正确的。

代码是:

gcc -std=c++11 test.cpp 或 gcc test.cpp

包括 iostream

使用命名空间标准;

int main(int argc, char** argv) { }

错误信息是:

/tmp/ccfBvaqg.o:test.cpp:(.text+0x44): 未定义引用std::ios_base::Init::Init()' /tmp/ccfBvaqg.o:test.cpp:(.text+0x44): relocation truncated to fit: R_X86_64_PC32 against undefined symbolstd::ios_base::Init::Init()'

/tmp/ccfBvaqg.o:test.cpp:(.rdata$.refptr._ZNSt8ios_base4InitD1Ev[.refptr._ZNSt8ios_base4InitD1Ev]+0x0): 未定义引用`std::ios_base::Init::~Init()'

【问题讨论】:

  • 与包含文件无关,是链接错误。事实上,您没有链接到标准 c++ 库 (-lstdc++)。
  • 那不是有效的代码。 C++ 代码不以gcc -std 开头,include 前面有一个井号(井号),文件名包含在<> 中。此外,这是重复的,如果您在发布前在这里搜索 undefined reference 就会知道这一点。 (顺便说一句,代码不是用块引号格式化的;它被格式化为代码。选择它并按键盘上的 Ctrl+K 或单击工具栏上的 {} 按钮。)

标签: c++11 gcc cygwin


【解决方案1】:

gcc 是 C 编译器驱动程序。编译器根据文件名自动检测语言;这就是编译成功的原因。但是,链接器不受源文件名称的影响。默认情况下,C 编译器驱动程序不与 C++ 标准库链接。

由于您使用了标准库(<iostream> 是一个有点不典型的头文件,仅包含它会导致在程序开始时调用标准库函数),但没有链接它,链接器失败。解决方案是与 C++ 标准库链接。最简单的方法是使用默认链接标准库的 C++ 编译器驱动程序 (g++)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 2013-11-28
    • 1970-01-01
    相关资源
    最近更新 更多