【问题标题】:Yet another linker issue另一个链接器问题
【发布时间】:2009-08-19 08:42:41
【问题描述】:

我遇到了一个基本 C++ 程序的链接问题。不,我不包括 .cpp 文件!

这就是正在发生的事情。

main.cpp:

#include "header.h"
#include <iostream>

int main() {
   std::cout << "Hello!";
}

header.h:

#ifndef _HEADER_H
#define _HEADER_H

class Something {
public:
   printContents();
};

#endif

something.cpp:

#include "header.h"

#include <iostream>

Something::printContents() {
    cout << "This class's Contents!!";
}

发生的情况是我得到一个编译器错误:某些标准 C 函数的多个定义,例如 strtod:

g++ -o ... main.o
build/....main.o: 在函数中 `strtod':

../MinGW/bin/../lib/gcc/mingw32/3.4.5/../../../../include/stdlib.h:318: `strtod'的多重定义

构建/..something.o:...something.cpp:(.text+0x0): 首先在这里定义 collect2:ld 返回 1 个退出状态

如果我在两种情况之一中删除#include &lt;iostream&gt; 并删除couts,它将编译。这是怎么回事?我正在使用 g++ 和 NetBeans 进行编译。

我在命令行中试过:

g++ *.h *.cpp -o program

同样的事情发生了。

【问题讨论】:

  • 我很惊讶你甚至可以使用该代码访问链接器。
  • 您能否详细说明如何编译和链接?
  • 我最终解决了这个问题。修复代码和#ifndef 修复了这一切。我仍然不完全确定错误是如何发生的。我制作了自己的 makefile,错误似乎消失了。

标签: c++ linker header-files


【解决方案1】:

请注意_HEADER_H 是 C++ 用户代码中的非法名称 - 以下划线和大写字母开头的名称保留用于 C++ 实现。这通常不会导致明显的问题,但是当您在这种情况下使用 HEADER 之类的实现中可能是通用名称时,它很可能会出现。

【讨论】:

    【解决方案2】:

    修改,

    Something::printContents() 
    {    
      std::cout << "This class's Contents!!";
    }
    

    注意:指定返回数据类型。

    【讨论】:

      【解决方案3】:

      你的一个问题就在这里:

      我在命令行中试过:g++ *.h *.cpp -o 程序

      不要传递你的头文件...试试这样的:

      g++ *.cpp -o 程序

      【讨论】:

      • 应该,但我只是指出在命令行上尝试的错误。其他回答者指出了实际的代码错误。
      • 我现在明白你的答案了! :)
      • 虽然编译头文件是一件毫无意义的事情,但它也是无害的——毕竟,编译 foo.h 与编译由单行 #include &lt;foo.h&gt; 组成的 foo.cpp 完全相同——即有效的。我想如果它试图根据文件扩展名在 C 和 C++ 之间切换,它可能会混淆编译器 - 我相信 VC++ 会这样做,但是使用 gcc/g++ 就没有这种歧义,是吗?
      【解决方案4】:

      我无法重现您的确切问题。我得到这个编译并很好地链接了以下几个注释:

      • void 返回类型添加到printContents 函数(因此它在标题中显示void printContents();,在实现文件中显示void Something::printContents() {
      • 使用std::cout 而不仅仅是coutcout 未在其使用范围内定义
      • 确保 header.h 以空行结尾
      • 使用 HEADER_H 而不是 _HEADER_H(就像 Neil Butterworth 所说)

      我使用命令行g++ main.cpp something.cpp编译。

      【讨论】:

        【解决方案5】:

        我发现了几个问题。你应该定义函数的返回值

        printContents()
        

        你必须写

        std::cout
        

        如果你不写

        using namespace std;
        

        【讨论】:

        • 感谢您的提示。引起大家的注意,我确实有正确的语法,返回类型..等等。我输入的问题超级快。不过感谢您的提示。
        • 也请大家注意——不要那样做!始终使用复制和粘贴来发布真实代码。
        • 未来会努力的更好——我相信每个人都经历过“为你的生活塑造”的阶段。我很抱歉。
        【解决方案6】:

        问题出在 MinGW 的多重安装中。我已经安装了一个,当我在我的计算机上安装 Qt 时,它已经安装了它自己的 MinGW。糟糕,我将代码移植到了我大学的服务器上,它运行正常。

        真烦!!

        感谢大家的帮助,以后我一定会按照你们的指导方针。

        标题名称 - 没有下划线 正确的返回类型 论坛中的真实代码!

        里奥·布鲁扎尼蒂

        【讨论】:

          猜你喜欢
          • 2015-08-06
          • 1970-01-01
          • 1970-01-01
          • 2018-12-09
          • 2014-03-31
          • 1970-01-01
          • 1970-01-01
          • 2011-05-08
          • 2020-02-19
          相关资源
          最近更新 更多