我正在输入一个来自Absolute C ++的示例程序,它不断给我这个错误:
f
我已将程序简化为纯粹的基础知识,但我仍然无法弄清楚发生了什么。有人可以帮忙吗?
生成文件:
/tmp/ccJfp4DM.o: In function `HashTableSavitch::HashTable::HashTable()':
hashtableimp.cpp:(.text+0x0): multiple definition of `HashTableSavitch::HashTable::HashTable()'
/tmp/ccHuZlFl.o:hashtable.cpp:(.text+0x0): first defined here
/tmp/ccJfp4DM.o: In function `HashTableSavitch::HashTable::HashTable()':
hashtableimp.cpp:(.text+0x0): multiple definition of `HashTableSavitch::HashTable::HashTable()'
/tmp/ccHuZlFl.o:hashtable.cpp:(.text+0x0): first defined here
/tmp/ccJfp4DM.o: In function `HashTableSavitch::HashTable::~HashTable()':
hashtableimp.cpp:(.text+0x16): multiple definition of `HashTableSavitch::HashTable::~HashTable()'
/tmp/ccHuZlFl.o:hashtable.cpp:(.text+0x16): first defined here
/tmp/ccJfp4DM.o: In function `HashTableSavitch::HashTable::~HashTable()':
hashtableimp.cpp:(.text+0x16): multiple definition of `HashTableSavitch::HashTable::~HashTable()'
/tmp/ccHuZlFl.o:hashtable.cpp:(.text+0x16): first defined here
/tmp/ccJfp4DM.o: In function `HashTableSavitch::HashTable::~HashTable()':
hashtableimp.cpp:(.text+0x44): multiple definition of `HashTableSavitch::HashTable::~HashTable()'
/tmp/ccHuZlFl.o:hashtable.cpp:(.text+0x44): first defined here
/tmp/ccJfp4DM.o: In function `HashTableSavitch::HashTable::computeHash(std::string)':
hashtableimp.cpp:(.text+0x6a): multiple definition of `HashTableSavitch::HashTable::computeHash(std::string)'
/tmp/ccHuZlFl.o:hashtable.cpp:(.text+0x6a): first defined here
/tmp/ccJfp4DM.o: In function `HashTableSavitch::HashTable::containsString(std::string) const':
hashtableimp.cpp:(.text+0x7a): multiple definition of `HashTableSavitch::HashTable::containsString(std::string) const'
/tmp/ccHuZlFl.o:hashtable.cpp:(.text+0x7a): first defined here
/tmp/ccJfp4DM.o: In function `HashTableSavitch::HashTable::put(std::string)':
hashtableimp.cpp:(.text+0x8e): multiple definition of `HashTableSavitch::HashTable::put(std::string)'
/tmp/ccHuZlFl.o:hashtable.cpp:(.text+0x8e): first defined here
collect2: error: ld returned 1 exit status
Makefile:2: recipe for target 'hashTable' failed
make: *** [hashTable] Error 1
hashtable.h
hashTable: listtools.h listtools.cpp hashtable.h hashtable.cpp hashtableimp.cpp
g++ listtools.h listtools.cpp hashtable.h hashtable.cpp hashtableimp.cpp -o hashTable
hashtable.cpp
#ifndef HASHTABLE_H
#define HASHTABLE_H
#include <string>
#include "listtools.h"
using LinkedListSavitch::Node;
using std::string;
namespace HashTableSavitch {
const int SIZE = 10;
class HashTable {
public:
HashTable();
virtual ~HashTable();
bool containsString(string target) const;
void put(string s);
private:
Node<string> *hashArray[SIZE];
static int computeHash(string s);
};
}
#endif
hashtableimp.cpp
#include <string>
#include "listtools.h"
#include "hashtable.h"
using LinkedListSavitch::Node;
using LinkedListSavitch::search;
using LinkedListSavitch::headInsert;
using std::string;
namespace HashTableSavitch {
HashTable::HashTable() {
}
HashTable::~HashTable() {
}
int HashTable::computeHash(string s) {
return 0;
}
bool HashTable::containsString(string target) const {
return true;
}
void HashTable::put(string s) {
}
} // HashTableSavitch
listtools.h
#include <string>
#include <iostream>
#include "hashtable.h"
#include "listtools.cpp"
#include "hashtable.cpp"
using std::string;
using std::cout;
using std::endl;
using HashTableSavitch::HashTable;
int main() {
HashTable h;
cout << "Adding cat, dog, turtle, and bird" << endl;
h.put("cat");
h.put("dog");
h.put("turtle");
h.put("bird");
cout << "Contains cat? " << h.containsString("cat") << endl;
cout << "Contains dog? " << h.containsString("dog") << endl;
cout << "Contains turtle? " << h.containsString("turtle") << endl;
cout << "Contains bird? " << h.containsString("bird") << endl;
cout << "Contains cow? " << h.containsString("cow") << endl;
cout << "Contains fish? " << h.containsString("fish") << endl;
return 0;
}
答案 0 :(得分:9)
如果要在#include
命令行上列出它们,则不应hashtableimp.cpp
cpp进入主g++
。
实际上你有两个选择:
#include
分成另一个文件,这样它实际上就是一个文件) - 在这种情况下你需要在g++
命令行g++
命令行中列出所有这些文件,但不需要将带有定义(通常为cpp)的#include
个文件放入其他文件中。原因是One Definition Rule:任何函数(有一些例外)都应该在整个程序的一个地方定义。如果你#include
一个人进入其他人,然后编译所有这些,你重复定义。
通常前者用于小型程序,后者用于较大型项目。更常见的是,在后一种方法中,您通常会逐个编译每个文件,然后将它们链接在一起。
另请注意,您通常不需要在命令行中列出.h
个文件,它们不应该由自己编译,而只需要#include
d到其他.cpp
}文件,以便编译器知道在那里使用的函数/对象/等的声明。