又一个链接器问题

时间:2009-08-19 08:42:41

标签: c++ linker header-files

我遇到了基本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 /../../../../包括/ stdlib.h中:318:   `strtod'的多重定义

     

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

如果我在两次中的一次中摆脱#include <iostream>并摆脱cout,它将编译。这是怎么回事?我正在使用g ++和NetBeans进行编译。

我在命令行中尝试过:

g++ *.h *.cpp -o program
发生了同样的事情。

6 个答案:

答案 0 :(得分:4)

请注意,_HEADER_H是C ++用户代码中的非法名称 - 以下划线开头的名称和大写字母是为C ++实现保留的。这通常不会引起明显的问题,但是当您在此上下文中使用HEADER等实现中的常用名称时,很可能会这样。

答案 1 :(得分:4)

修改,

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

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

答案 2 :(得分:3)

你的一个问题就在这里:

  

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

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

  

g ++ * .cpp -o program

答案 3 :(得分:3)

我无法重现您的确切问题。我可以通过以下几个注释来编译和链接:

  • void返回类型添加到printContents - 函数(标题中的void printContents();和实现文件中的void Something::printContents() {
  • 使用std::cout而非coutcout未在其使用范围内定义
  • 确保header.h以空行结束
  • 使用HEADER_H而非_HEADER_H(如Neil Butterworth所说)

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

答案 4 :(得分:2)

我看到了几个问题。您应该定义函数的返回值

printContents()

你必须写

std::cout

如果你不写

using namespace std;

答案 5 :(得分:0)

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

无赖!!

感谢大家的帮助,我将来一定会遵循您的指导方针。

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

Leo Bruzzaniti