2012-04-29 4 views
0

Я только что вернулся к работе с C++ после долгого времени. Я использую Eclipse на Macbook Pro, и я попробовал сделать небольшой проект Linked Lists.Ошибка при компиляции в Eclipse: ld: символы (символы) не найдены для архитектуры x86_64

Я получаю эту ошибку, когда я пытаюсь скомпилировать мой проект:
ld: symbol(s) not found for architecture x86_64

Это происходит только тогда, когда я #include "SingleLinkedList.h" в моей main.cpp и делать операции, связанные с SingleLinkedist, в противном случае удаления вышеуказанной SingleLinkedList в основном, проект компилирует штрафы. Я смотрел похожие вопросы на SO с той же ошибкой, но никто, похоже, не помог мне решить эту проблему.

При необходимости введите файлы классов:
Насколько я помню, раньше все так же хорошо работало на Eclipse. Я только что обновился до Lion некоторое время назад, и установил новый Xcode и новый Eclispe, и теперь столкнулся с странными проблемами, а не концентрировался на кодировании.

SingleLinkedList.cpp

#include "SingleLinkedList.h" 

template<class T> 
SingleLinkedList<T>::~SingleLinkedList() 
{ 
    Node<T> *temp = head; 
    while(head!=0) 
    { 
     temp = head; 
     head = temp->next; 
     delete temp; 
    } 
} 

template <class T> 
void SingleLinkedList<T>::addToHead(int item) 
{ 
    head = new Node<T>(item, head); 
    if (tail==0) 
     tail = head; 
} 

template <class T> 
void SingleLinkedList<T>::addToTail(int item) 
{ 
    if(tail!=0) 
    { 
    tail->next = new Node<T>(item); 
    tail = tail->next; 
    } 
    else 
     head = tail = new Node<T>(item); 
} 

template <class T> 
int SingleLinkedList<T>::deletefromHead() 
{ 
    int e1 = head->info; 
    Node<T> *temp = head; 
    if(head ==tail) 
    { 
    head = tail = 0; 
    } 
    else 
     head = temp->next; 
    delete temp; 
    return e1; 
} 

template <class T> 
int SingleLinkedList<T>::deletefromTail() 
{ 
    int e1 = tail->info; 
    if(head == tail) 
    { 
     delete head; 
     head = tail = 0; 
    } 
    else{ 
     Node<T> *temp = head; 
     while(temp->next != tail) 
      temp = temp->next; 
     delete tail; 
     tail = temp; 
     tail->next = 0; 
    } 
    return e1; 
} 

template <class T> 
void SingleLinkedList<T>::deleteNode(int item) 
{ 
    if(head!=0) { 
     if(head == tail && head->info){ //If this is the only item in the linked list 
      delete head; 
      head = tail = 0; 
     } 
     else if (item == head->info){ 
      Node<T> *temp = head; 
      head = temp->next; 
      delete temp; 
     } 
     else{ 
      Node<T> *temp = head; 
      while(temp->next->info != item && temp->next !=0){ 
       temp = temp->next; 
      } 
      if(temp!=0){ 
       temp->next = temp->next->next; 
       temp = temp->next; 
       delete temp; 
      } 
     } 
    } 
} 

template <class T> 
bool SingleLinkedList<T>::isEmpty() 
{ 
    return head == 0; 
} 

template <class T> 
bool SingleLinkedList<T>::isInList(int item)const 
{ 
    Node<T> * temp = head; 
    while(temp!=0) 
    { 
     if(temp->info == item){ 
      break; 
     } 
     temp = temp->next; 
    } 
    return temp->info == item; 
} 

template<class T> 
SingleLinkedList<T>::SingleLinkedList() 
{ 
    head = tail = 0; 
} 

SingleLinkedList.h

#include "Node.h" 

#ifndef SINGLELINKEDLIST_H_ 
#define SINGLELINKEDLIST_H_ 

template <class T> 
class SingleLinkedList { 
public: 
    SingleLinkedList(); 
    ~SingleLinkedList(); 

    bool isEmpty(); 
    bool isInList(int)const; 

    void addToHead(int); 
    void addToTail(int); 
    int deletefromHead(); 
    int deletefromTail(); 
    void deleteNode(int); 
private: 
    Node<T> *head; 
    Node<T> *tail; 
}; 
#endif /* SINGLELINKEDLIST_H_ */ 

main.cpp

#include <iostream> 
#include "SingleLinkedList.h" 
using namespace std; 
int main() { 
    SingleLinkedList<int> listfile; 
    listfile.addToHead(2); 
    listfile.addToHead(4); 
    listfile.addToHead(6); 
    listfile.addToHead(8); 
    listfile.addToHead(10); 
return 0; 
} 

ответ

2

На самом деле причина этого не в том, что вы не определяете заголовочные файлы для классов шаблонов с отдельной реализацией, потому что у шаблонов нет другой реализации, кроме того, что генерирует компилятор. Так что неправильный C++ имеет .cpp-файл. Поместите все встроенные или сохраните их только в заголовке. see the following at the very bottom

+0

О, дерьмо, я не видел твой комментарий внизу ... Ну ладно. Хорошо, чтобы это было отмечено так, что другие будут видеть это быстрее –

0

Вы п чтобы убедиться, что они находятся в пути сборки, так что eclipse знает, чтобы связать файл .cpp с остальной частью двоичного файла. Перейдите в project -> properties -> C++ general -> Paths and symbols -> source location и вы сможете установить его там. Когда вы создадите снова, убедитесь, что .cpp-файл, содержащий реализацию, строится, просматривая журнал сборки.

Добавление вашего источника не очень помогает, если вы не включаете весь журнал сборки, просто говоря.

+0

Здесь не отображается опция 'includes'. http://i.imgur.com/ornFi.png – user1240679

+0

C++ general ** извините –

+0

Не под C++ вообще либо: http://i.imgur.com/S2hjc.png. Не находите 'includes', ища в верхний окно поиска также. – user1240679

Смежные вопросы

 Смежные вопросы