0

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

这就是正在发生的事情。

主.cpp:

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

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

标头.h:

#ifndef _HEADER_H
#define _HEADER_H

class Something {
public:
   printContents();
};

#endif

某事.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”的多重定义

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

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

我在命令行中尝试过:

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

同样的事情也发生了。

4

6 回答 6

4

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

于 2009-08-19T08:47:01.233 回答
4

调整,

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

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

于 2009-08-19T08:51:06.983 回答
3

您的问题之一就在这里:

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

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

g++ *.cpp -o 程序

于 2009-08-19T08:46:39.910 回答
3

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

  • 向 -function添加void返回类型printContents(所以它void printContents();在标题和void Something::printContents() {实现文件中说)
  • 使用std::cout而不仅仅是cout. cout未在其使用范围内定义
  • 确保 header.h 以空行结尾
  • 使用HEADER_H而不是_HEADER_H(如 Neil Butterworth 所说)

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

于 2009-08-19T08:52:01.740 回答
2

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

printContents()

你必须写

std::cout

如果你不写

using namespace std;
于 2009-08-19T08:56:31.373 回答
0

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

无赖!!

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

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

里奥·布鲁扎尼蒂

于 2009-08-21T01:31:08.220 回答