2012-04-13 30 views
10

Mam poważny problem z moim kodem C, po prostu nie mogę go skompilować i naprawdę nie mogę zrozumieć dlaczego .C nie można skompilować - nie znaleziono symbolu dla architektury x86_64

Próbowałem badań online i nie mogę znaleźć rozwiązania tego problemu, czy masz jakiś pomysł?

Dziękujemy za poświęcony czas!

Undefined symbols for architecture x86_64: 
    "_Insert", referenced from: 
     _InsertNode in part1.o 
    (maybe you meant: _InsertNode) 
    "_Create", referenced from: 
     _findShortestPaths in part1.o 
    "_DeleteMin", referenced from: 
     _findShortestPaths in part1.o 
    "_decreaseKey", referenced from: 
     _findShortestPaths in part1.o 
    "_GetMin", referenced from: 
     _findShortestPaths in part1.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 
make: *** [part1] Error 1 

Snippits z part1.c

#include "limits.h" 
#include "pegBinaryHeap.h" 

void InsertNode(int distance, Node* node, PriorityQueue PQ) { 
    ... 
    Insert(*item, PQ); 
} 

... 

int* findShortestPaths(Graph *graph, int start) { 
    ... 

    //Priority queue ordered by distance 
    PriorityQueue pq = Create(graph->MaxSize); 
    for(int i = 0; i < graph->MaxSize; i++) { 
    ... 
    } 

    //While the queue isn't empty: 
    while((currentPqItem=GetMin(pq)) != NULL) { 
    ... 
    DeleteMin(pq); 

     //for each node accesable from currentNode 
    List *currentNeighbour = currentNode.outlist; 

    while(currentNeighbour!=NULL) { 
     ... 
     decreaseKey(currentNode.id, newDistance, pq); 
    } // end for 
    }// end while 
} 

int main(int argc,char *argv[]) 
{ 
    Graph mygraph; 
    return 0; 
} 

i plik .h, który wydaje się być narzekających

#include "graph.h" 

struct HeapStruct; 
typedef struct HeapStruct *PriorityQueue; 

typedef struct { 
    int distance; 
    Node *node; 
} QueueType; 

PriorityQueue Create(int MaxSize); 
void Destroy(PriorityQueue H); 
int Insert(QueueType Item, PriorityQueue H); 
QueueType DeleteMin(PriorityQueue H); 
QueueType* GetMin(PriorityQueue H); 
void decreaseKey(int nodeId, int value, PriorityQueue H); 
+0

Gdzie znajduje się plik '.c' zawierający funkcje, na które narzeka (" Wstaw "," Utwórz "itp.)? –

+0

W tym samym folderze "pegBinaryHeap.c " –

+0

Proszę napisać polecenie, którego używasz do kompilacji kodu: –

Odpowiedz

16

Można kompilacji, ale nie można Link.

korzysta z funkcji zdefiniowanych w ostatnim pliku .h, a implementacji nie można znaleźć. Po połączeniu programu musisz upewnić się, że łączysz plik (y) obiektu (lub biblioteki), które zawierają implementacje tych funkcji. Masz może zrobić coś takiego:

gcc part1.c -o myapp

a więc łącznik nie posiada wszystkie kawałki układanki.

Jeśli chcesz skompilować w części należy do:

gcc -c part1.c -o part1.o 
gcc -c implementations.c -o implementations.o 
gcc implementations.o part1.o -o myapp 

Tutaj wszyscy .c pliki są kompilowane do obiektu (.o) Pliki oddzielnie, a następnie połączone do pliku wykonywalnego. Albo można zrobić wszystkiego naraz:

gcc part1.c implementations.c -o myapp 

Jeśli implementacje znajdują się w bibliotece (libimplementations.a):

gcc part1.c -Lpath/to/libs -limplementations -o myapp 
+0

Zaakceptowany, chociaż nie podałeś Odpowiedź, masz bardzo jasne wyjaśnienie, które poprawiło moje zrozumienie plików nagłówkowych i obiektowych c! –

+1

@greg każdy szczególny powód, dla którego kod C użyje kompilatora C++? Jest to wykonalne, ale często prowadzi do dziwnych ostrzeżeń/błędów kompilatora. Również jest dużo wolniej (czas kompilacji). – AoeAoe

+0

@AoeAoe pisanie g ++ zamiast gcc było literówką (całe C++ pisałem przez cały ranek). Edytujemy teraz, chociaż pojęcia, które próbowałem wyjaśnić, są dokładnie takie same. – greg

2

Co twoja komenda kompilacji wyglądać? Wygląda na to, że nie mówisz, żeby połączyć bibliotekę, w której znajdują się te procedury.

+4

To powinno być komentarzem, a nie odpowiedzią –

+1

@AdamLiss Nie zgadzam się, rozwiązaniem jest" powiedz aby połączyć brakujący kod ", co jest właściwie tym, co zasugerowała ta odpowiedź: –

+1

Nie wydaje mi się, aby móc jeszcze komentować pytania: – Mark

0

Chciałbym spróbować stworzyć minimalistyczny przykład, który pokazuje ten sam błąd. Brakuje nam zbyt wielu informacji, aby pomóc Ci to zdiagnozować. Kod w innych plikach i rzeczywiste polecenia kompilacji (nie tylko część pliku Makefile, ale rzeczywiste polecenia) mogą być źródłem tego problemu.

(tak, to powinien być komentarz raczej niż odpowiedź, ale nie jestem w stanie wypowiedzieć się na temat pytań z jakiegoś powodu)

4

Chciałbym dodać, że był już podobny błąd kompilacji. Zobacz poniżej.

Undefined symbols for architecture x86_64: 
    "_add", referenced from: 
    _load in file.o 
ld: symbol(s) not found for architecture x86_64 
collect2: ld returned 1 exit status 
make: *** [all] Error 1 

I rozwiązać ten problem poprzez wdrożenie dodatek (prototyp funkcje), że stworzył w moim pliku nagłówka. Po wdrożeniu nie otrzymałem już tego błędu. Może pomóc komuś innemu.

Powiązane problemy