好的,我应该在链接时定义一个变量HASH_TABLE_SIZE,所以我会把它放在我的makefile中。
我的Makefile如下:
1 CC = g++
2 CFLAGS = -c -g -std=c++11 -Wall -W -Werror -pedantic -D HASH_TABLE_SIZE=10
3 LDFLAGS = -lrt
4
5 myhash : main.o hash.o hash_function.o
6 $(CC) $(LDFLAGS) main.o hash.o hash_function.o -o myhash
7
8 main.o : main.cpp hash.h
9 $(CC) $(LDFLAGS) main.cpp
10
11 hash.o : hash.cpp hash.h
12 $(CC) $(LDFLAGS) hash.cpp
13
14 hash_function.o : hash_function.cpp hash.h
15 $(CC) $(LDFLAGS) hash_function.cpp
16
17 clean :
18 rm *.o myhash
我的Makefile对我来说似乎是对的,而且我把-D HASH_TABLE_SIZE = 10。 但是,当我做的时候,我收到了这个错误:
In file included from main.cpp:3:0:
hash.h:24:27: error: 'HASH_TABLE_SIZE' was not declared in this scope
list<string> hashTable[HASH_TABLE_SIZE];
我的Hash.h文件如下:
1 /* This assignment originated at UC Riverside. The hash table size
2 should be defined at link time. Use -D HASH_TABLE_SIZE=X */
3
4 #ifndef __HASH_H
5 #define __HASH_H
6
7 #include <string>
8 #include <list>
9
10 using namespace std;
11
12 class Hash {
13
14 public:
15 Hash();
16 void remove(string word);
17 void print();
18 void processFile(string fileName);
19 bool search(string word);
20 void output(string fileName);
21 void printStats();
22
23 private:
24 list<string> hashTable[HASH_TABLE_SIZE];
25 int collisions;
26 int longestList;
27 double avgLength;
28
29 private:
30 int hf(string ins);
31 double newAvgListLen;
32
33 // put additional variables/functions below
34 // do not change anything above!
35
36 };
37
38 #endif
为什么会这样?任何帮助将不胜感激。
答案 0 :(得分:2)
快速解决方案
您没有在食谱中使用CFLAGS
,因此它没有效果。
如果您将第8行到第15行更改为:
,它应该有效8 main.o : main.cpp hash.h
9 $(CC) $(CFLAGS) main.cpp
10
11 hash.o : hash.cpp hash.h
12 $(CC) $(CFLAGS) hash.cpp
13
14 hash_function.o : hash_function.cpp hash.h
15 $(CC) $(CFLAGS) hash_function.cpp
一些额外的细节
-D
是编译时标志,不是链接时选项。
CFLAGS
通常用于将编译时标志传递给C程序的编译器。
通常CXXFLAGS
将用于诸如此类的C ++程序和CXX
以指定C ++编译器。虽然Make并不介意,但是当使用约定时它可以更容易理解。
LDFLAGS
通常用于传递像-lrt
这样的链接时间标记,所以只在第6行使用它,而不是在编译步骤中使用它。