我遇到了基本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
发生了同样的事情。
答案 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
而非cout
。 cout
未在其使用范围内定义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