我是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/

10-16 21:42