在编译C ++项目时获取未定义的符号错误,但在调用LitTab类中定义的静态方法时会出现问题。这是以下代码:
#ifndef __dasm__LitTab__
#define __dasm__LitTab__
#include <map>
class LitTab {
private:
static std::map<int, int> table;
public:
static void add(int address, int value);
static int get(int address);
static bool contains(int address);
};
#endif
和实施:
#include "LitTab.hpp"
std::map<int, int> LitTab::table;
void LitTab::add(int address, int value) {
table.insert(std::pair<int, int>(address, value));
}
bool LitTab::contains(int address) {
return LitTab::table.find(address) != LitTab::table.end();
}
int LitTab::get(int address) {
if(LitTab::contains(address)) return LitTab::table[address];
return NULL;
}
这里是调用主函数:
#include "LitTab.hpp"
using namespace std;
map<int, int> LitTab::table; // is this necessary?
int main(int argc, const char * argv[]) {
LitTab::add(1, 1); // fails here
return 0;
}
以下是错误消息:
c++ -c -o regex.o regex.cpp
g++ -g -Wall -O0 -o dasm main.o optab.o LitTab.o File.o RecordTokenizer.o InstructionTokenizer.o regex.o
duplicate symbol __ZN6LitTab5tableE in:
main.o
LitTab.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [dasm] Error 1
老实说,我花了最后一个半小时在论坛,搜索引擎优化和其他网站上搜索,我试图寻找,我不知道还有什么可做的。我需要帮助。
编辑:添加Makefile
CC=g++
CFLAGS=-g -Wall -O0
all: dasm
dasm: main.o optab.o LitTab.o File.o RecordTokenizer.o InstructionTokenizer.o regex.o
$(CC) $(CFLAGS) -o $@ $^
clean:
rm *.o dasm