我是C ++的新手,此类将与Flex扫描仪一起使用。我在这里只是为了使其易于编译而保持简单,但是我得到了以下消息(关于此消息的其他线程似乎都不适用于我的情况):
架构x86_64的未定义符号:
从以下引用的“ Listing :: lexicalError”
Listing.o中的Listing :: Listing()
Listing.o中的Listing :: displayErrorCount()
Listing.o中的Listing :: increaseLexicalError()
ld:找不到架构x86_64的符号
Listing.h
using namespace std;
class Listing
{
public:
enum ErrorType {LEXICAL, SYNTAX, SEMANTIC};
Listing();
void appendError(ErrorType error, char yytext[]);
void displayErrorCount();
void increaseLexicalError();
private:
static int lexicalError;
};
Listing.cpp
#include <iostream>
#include <sstream>
using namespace std;
#include "Listing.h"
Listing::Listing()
{
lexicalError = 0;
}
void Listing::appendError(ErrorType error, char yytext[])
{
switch (error) {
case LEXICAL:
cout << "Lexical Error, Invalid Character " << yytext << endl;
break;
case SEMANTIC:
cout << "Semantic Error, ";
case SYNTAX:
cout << "Syntax Error, ";
default:
break;
}
}
void Listing::displayErrorCount()
{
cout << "Lexical Errors " << lexicalError << " ";
}
void Listing::increaseLexicalError()
{
lexicalError++;
}
感谢您提供的任何编译帮助。我确定C ++代码不是很漂亮,但是我正在学习...
这是Makefile:
compile: scanner.o listing.o
g++ -o compile scanner.o listing.o
scanner.o: scanner.c listing.h tokens.h
g++ -c scanner.c
scanner.c: scanner.l
flex scanner.l
mv lex.yy.c scanner.c
listing.o: listing.cpp listing.h
g++ -c listing.cpp
最佳答案
您必须在.cpp文件中定义静态成员变量lexicalError
:
#include <iostream>
#include <sstream>
using namespace std;
#include "Listing.h"
// here is the definition
int Listing::lexicalError = 0;
Listing::Listing()
{
// not sure if you really want to do this, it sets lexicalError to zero
// every time a object of class Listing is constructed
lexicalError = 0;
}
[...]
关于c++ - 麻烦编译-C++的新手,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25585139/