Как исправить ошибки архитектуры x86_64?

Я использую omnet++ 4.6 уже около 6 месяцев. Когда я попытался построить свой проект после нескольких изменений:

  • удаление заголовочного файла из проекта
  • добавив больше файлов в мою папку включений

Я получаю эту ошибку

Creating shared library: ../out/gcc-debug/src/libinet.dylib
    Undefined symbols for architecture x86_64:
      "BloomFilter::BloomFilter(unsigned long, int, unsigned long, ...)", referenced from:
          AODVRouting::AODVRouting() in AODVRouting.o
          AODVRouting::AODVRouting() in AODVRouting.o
    ld: symbol(s) not found for architecture x86_64
    clang: error: linker command failed with exit code 1 (use -v to see invocation)
    make[1]: *** [../out/gcc-debug/src/libinet.dylib] Error 1
    make: *** [all] Error 2

Мой проект раньше строился и работал нормально.

Это .cc файл:

    #include "BloomFilter.h"
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <climits>
#include <cstdarg>
#include <exception>
#include <stdio.h>
#include <string.h>

using namespace std;


#define SETBIT(a, n) (a[n/CHAR_BIT] |= (1<<(n%CHAR_BIT)))
#define GETBIT(a, n) (a[n/CHAR_BIT] & (1<<(n%CHAR_BIT)))


// The Constructor
BloomFilter::BloomFilter(size_t size,int hash_k, size_t nfuncs, ...) {


          va_list l;
          unsigned int n;

          try {
            this->a=new char[(size+CHAR_BIT-1)/CHAR_BIT];
          }
          catch(const std::exception& e)
          {
              // If we get here is that there is an allocation error .
              // We must free the memory .
            delete(this);
            // std :: cerr << "ERROR: " << e.what () << endl;
            // Then raise the exception to indicate that an error occurred.
            throw;
          }


          try {
                  this->funcs= new hashfunc_t[nfuncs];
                  }
          catch(const std::exception& e){
            delete(this->a);
            delete(this);
              }

          va_start(l, nfuncs);
          for(n=0; n < nfuncs; ++n) {
            this->funcs[n]=va_arg(l, hashfunc_t);
          }
          va_end(l);

          this->nfuncs=nfuncs;
          this->asize=size;
          this->hash_k=hash_k;

}

// The Destructor
BloomFilter::~BloomFilter() {
        /*
        delete(this->a);
          delete(this->funcs);
          delete(this);
          */
}

int BloomFilter::AddToBloom(std::string word){
    char t= '1';
    int AddFlag;    // to know if the element is added successfully
    for(int i=0;i<this->hash_k;i++){
        AddFlag=Add(word += t);
                t++;
    }
    return AddFlag;
}


int BloomFilter::Add(std::string word){
        size_t size = word.size() + 1;
        char * buffer = new char[ size ];
        strncpy( buffer, word.c_str(), size );

        return Add(buffer);
}

int BloomFilter::Add(const char *s)
{
  size_t n;

  for(n=0; n<this->nfuncs; ++n) {
    SETBIT(this->a, this->funcs[n](s)%this->asize);
  }

  return 0;
}

int BloomFilter::CheckBloom( std::string word){

    int CheckFlag;
    char t= '1';
        for(int i=0;i<this->hash_k;i++){
            if(!Check(word += t)) return 0;
                    t++;
        }
        return 1;


}
int BloomFilter::Check(std::string word){
        size_t size = word.size() + 1;
        char * buffer = new char[ size ];
        strncpy( buffer, word.c_str(), size );

        return Check(buffer);
}

int BloomFilter::Check(const char *s)
{
  size_t n;

  for(n=0; n< this->nfuncs; ++n) {
    if(!(GETBIT(this->a, this->funcs[n](s)%this->asize))) return 0;
  }

  return 1;
}

//Print information about this object
void BloomFilter::toString(){
        /*EV << "[BloomFilter] Hello, I am ready ? " << ready
        <<" ; max entry :" << maxEntry << endl;*/
}

Как исправить эту ошибку?

2 ответа

Решение

Я избавился от этой ошибки после копирования файлов .cc а также .h из моего корневого проекта в проект, над которым я работаю (в указанном каталоге). Я сделал это во время работы с omnet++ и в браузере проектов.

Я не уверен, как это связано с проблемой "компоновщика", но это определенно решило мою.

Это компоновщик, а не ошибка компилятора C++. Вам, вероятно, придется добавить файл.o, сгенерированный из вашего файла.cc, в список объектов, которые связаны вместе, чтобы сформировать libinet.dylib

Другие вопросы по тегам