2014-12-21 6 views
12

Ich habe versucht, für diesen Fehler online suchen, aber alle Beiträge sind für C++.C kompilieren: collect2: Fehler: ld zurückgegeben 1 Exit-Status

Dies ist die Botschaft:

test1.o: In function ReadDictionary': /home/johnny/Desktop/haggai/test1.c:13: undefined reference to CreateDictionary' collect2: error: ld returned 1 exit status make: *** [test1] Error 1

super einfach Code und kann nicht verstehen, was das Problem

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "dict.h" 
#include "hash.h" 


pHash ReadDictionary() { 
    /* This function reads a dictionary line by line from the standard input. */ 
    pHash dictionary; 
    char entryLine[100] = ""; 
    char *word, *translation; 

    dictionary = CreateDictionary(); 
    while (scanf("%s", entryLine) == 1) { // Not EOF 
     word = strtok(entryLine, "="); 
     translation = strtok(NULL, "="); 
     AddTranslation(dictionary, word, translation); 
    } 
    return dictionary; 
} 

int main() { 
    pHash dicti; 
... 

jetzt ist dies der Header dict.h

#ifndef _DICT_H_ 
#define _DICT_H_ 

#include "hash.h" 

pHash CreateDictionary(); 
... 

#endif 

und Hier ist das dict.c

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "hash.h" 
#include "dict.h" 


pHash CreateDectionary() 
{ 
    pHash newDict; 
    newDict= HashCreate(650, HashWord, PrintEntry, CompareWords, GetEntryKey, DestroyEntry); 
    return newDict; 
} 

und wenn Sie wollen, Check hash.h

#ifndef _HASH_H_ 
#define _HASH_H_ 

//type defintions// 
typedef enum {FAIL = 0, SUCCESS} Result; 
typedef enum {SAME = 0, DIFFERENT} CompResult; 

typedef struct _Hash Hash, *pHash; 

typedef void* pElement; 
typedef void* pKey; 

//function types// 
typedef int (*HashFunc) (pKey key, int size); 
typedef Result (*PrintFunc) (pElement element); 
typedef CompResult (*CompareFunc) (pKey key1, pKey key2); 
typedef pKey (*GetKeyFunc) (pElement element); 
typedef void (*DestroyFunc)(pElement element); 
... 

//interface functions// 

#endif 

Vielleicht wird es einfacher sein, wenn ich Ihnen die Dateien hier?

Jede Art und Weise, werde ich für Tipps, glücklich sein, wie das Problem

+3

Es ist das gleiche Problem in C und C++, der Linker kann CreateDictionary nicht finden. In Ihrem Fall ist es wahrscheinlich, weil Sie 'CreateDectionary' stattdessen definiert haben ... – Leiaz

+0

können Sie bitte erklären? was ich definiert habe statt was? – JohnnyF

+1

Sie haben einen Tippfehler. Wörterbuch nicht D ** e ** ctionary. – Leiaz

Antwort

13

Ihr Problem der Tippfehler in der Funktion erstellt e ctionary(). Sie sollten es in CreateD i ctionary() ändern. collect2: Fehler: ld zurückgegeben 1 Exit-Status ist das gleiche Problem in C und C++, bedeutet dies in der Regel, dass Sie ungelöste Symbole haben. In Ihrem Fall ist der Tippfehler, den ich vorher erwähnt habe.

+2

Ist die 'ld' in diesem zeigen Sie einen Fehler im Linker an? – UtahJarhead

0

zu verstehen, wenn Ihr Programm kompiliert wird, müssen Sie dict.c auch, zum Beispiel enthalten:

gcc -o test1 test1.c dict.c

plus Sie haben einen Tippfehler in dict.c Definition von CreateDictionary, heißt es CreateDectionary (e statt i)

+0

ich tat, immer noch das gleiche Problem – JohnnyF

+0

Kompilieren mit 'gcc -Wall -Wextra -g test1.c dict.c -o test1' –

+0

@JohnnyF, siehe meine aktualisierte Antwort - Sie haben einen Tippfehler :) –

0

Ich habe dieses Problem und versuchte viele Möglichkeiten, es zu lösen. Schließlich stellte sich heraus, dass make clean und make es wieder gelöst hat. Der Grund ist: Ich habe den Quellcode zusammen mit Objektdateien, die zuvor mit einer alten GCC-Version kompiliert wurden. Wenn meine neuere gcc-Version diese alten Objektdateien verknüpfen will, kann sie dort einige Funktionen nicht auflösen. Es passiert mir mehrmals, dass die Quellcode-Verteiler vor dem Packen nicht aufräumen, also rettete eine make clean den Tag.

1

manchmal kam dieser Fehler, weil es fehlgeschlagen war, in der Mitte eines Builds zu kompilieren. Der beste Weg zu versuchen ist, indem Sie make clean machen und wieder den ganzen Code machen.

+0

Das ist genau mein Fall. Es gibt ein Problem mit dem Code, aber ich bekomme immer noch den Fehler! – Pedram

0

Im Allgemeinen trat dieses Problem auf, wenn wir eine Funktion aufgerufen haben, die nicht in der Programmdatei definiert wurde. Um dieses Problem zu lösen, überprüfen Sie, ob Sie eine solche Funktion aufgerufen haben, die nicht in der Programmdatei definiert wurde.

-1
  1. Zum Erweiterte Systemeinstellungen in den Computereigenschaften
  2. Klicken Sie auf Advanced
  3. Klicken Sie für die Umgebungsvariable
  4. die Option Pfad wählen c
  5. zu Binärordner von dev
  6. Ändern Sie den Pfad Option
  7. Anwenden und speichern
  8. Speichern Sie den Code jetzt im Ordner bin im Entwickler c
+0

Ich weiß nicht, was Sie denken, diese Schritte zu tun, aber sie werden diesen Kompilierfehler sicher nicht beheben. –

+0

Ich habe das gleiche Problem wie die ursprüngliche Frage und diese Antwort, während ich total vom Thema bin, lache mich wirklich! Danke für das ^^ – Malick

Verwandte Themen