Проблема связывания с оберткой для CLucene - PullRequest
0 голосов
/ 09 февраля 2011

Я делаю небольшую обертку из CLucene.

ofxCLucene.h

#ifndef _OFXCLUCENE_
#define _OFXCLUCENE_

#include "ofMain.h"
#include "ofxXmlSettings.h"
#include "ofxDirList.h"
#include "CLucene.h"

using namespace lucene;
using namespace lucene::analysis;
using namespace lucene::analysis::standard;
using namespace lucene::index;
using namespace lucene::document;
using namespace lucene::queryParser;
using namespace lucene::search;
using namespace lucene::store;


class ofxCLucene {
private:
  string name;
  SimpleAnalyzer *sanalyzer; 
  Directory *dir;
  IndexWriter *writer;
  IndexReader *reader;

public:
  ofxCLucene(string name);
  ~ofxCLucene();

  void addDocumentsFromDirectory(string pathToDir);
  void addDocumentXML(ofxXmlSettings *docXML);

  void indexReader();
  void closeIndex();

  Hits* search(string query); 

};

#endif

ofxCLucene.cpp

#include "ofxCLucene.h"

//------------------------------------------------------------------------------
ofxCLucene::ofxCLucene(string name) {
  this->name = name;
  sanalyzer = new SimpleAnalyzer();
}

...

У меня нет проблем скомпилировать его, однако, когда я поместил его в свой проект и создал новый объект, я получил ошибки:

 "vtable for lucene::analysis::Analyzer", referenced from:


      __ZTVN6lucene8analysis8AnalyzerE$non_lazy_ptr in ofxCLucene.o


     (maybe you meant: __ZTVN6lucene8analysis8AnalyzerE$non_lazy_ptr)


  "vtable for lucene::analysis::SimpleAnalyzer", referenced from:


      __ZTVN6lucene8analysis14SimpleAnalyzerE$non_lazy_ptr in ofxCLucene.o


     (maybe you meant: __ZTVN6lucene8analysis14SimpleAnalyzerE$non_lazy_ptr)


ld: symbol(s) not found


collect2: ld returned 1 exit status

Исходный код от обоих:

class Analyzer:LUCENE_BASE{
public:

    virtual TokenStream* tokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader)=0;

    virtual ~Analyzer(){
    }

    virtual int32_t getPositionIncrementGap(const TCHAR* fieldName);
};



class SimpleAnalyzer: public Analyzer {
public:
    TokenStream* tokenStream(const TCHAR* fieldName, CL_NS(util)::Reader* reader);
    ~SimpleAnalyzer(){}
};

Я думал, что это проблема пространства имен, и я пытаюсь позвонить

analyzer::SimpleAnalyzer *sanalyzer = new analyzer::SimpleAnalyzer();

но проблема остается.

Предложения? Спасибо

1 Ответ

0 голосов
/ 13 февраля 2011

Это на маке, наверное? Я не очень знаком с компиляцией на Mac.

Можете ли вы рассказать нам, как вы компилируете (т.е. что такое флаги компиляции и т.д.). И, возможно, добавить пример, который компилируется).

Кроме того, вы можете скомпилировать этот код, используя вашу среду?

#include "CLucene.h"
int main(){
   lucene::analysis::SimpleAnalyzer *sanalyzer = new lucene::analysis::SimpleAnalyzer();
}

Я скомпилировал приведенный выше код с помощью следующей команды без проблем. (-FPIC, потому что я на 64-битной машине).

g ++ test.cpp -lclucene -I / usr / lib -fPIC

...