2014-12-21 10 views
12

Próbowałem wyszukać ten błąd w Internecie, ale wszystkie posty dotyczą C++.C compile: collect2: error: ld zwrócony 1 status wyjścia

Jest to przesłanie:

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

bardzo prosty kod i nie może zrozumieć, w czym 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; 
... 

teraz jest to nagłówek dict.h

#ifndef _DICT_H_ 
#define _DICT_H_ 

#include "hash.h" 

pHash CreateDictionary(); 
... 

#endif 

i tutaj jest 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; 
} 

i jeśli chcesz sprawdzić 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 

Może łatwiej będzie jeśli dam ci pliki tutaj?

jakikolwiek sposób, będę szczęśliwy dla wskazówek, jak zrozumieć problem

+3

To ten sam problem w C i C++, linker nie może znaleźć 'CreateDictionary'. W twoim przypadku jest tak prawdopodobnie dlatego, że zdefiniowałeś 'CreateDectionary' zamiast ... – Leiaz

+0

czy możesz wytłumaczyć? co zdefiniowałem zamiast czego? – JohnnyF

+1

Masz literówkę. Słownik nie D ** e ** cionowy. – Leiaz

Odpowiedz

13

Twój problem jest literówka w funkcji stworzony e ctionary(). Powinieneś to zmienić na CreateD i ctionary(). collect2: error: ld zwrócony 1 status wyjścia to ten sam problem w C i C++, zwykle oznacza to, że masz nierozwiązane symbole. W twoim przypadku jest to literówka, o której wspomniałem wcześniej.

+2

Czy" ld " w tym wskazuje błąd w linkerze? – UtahJarhead

0

Podczas kompilacji programu, trzeba to dict.c jak np:

gcc -o test1 test1.c dict.c

Plus masz literówkę w dict.c definicji CreateDictionary, mówi CreateDectionary (e zamiast i)

+0

Zrobiłem, wciąż ten sam problem – JohnnyF

+0

Skompiluj z 'gcc -Wall -Wextra -g test1.c dict.c -o test1' –

+0

@JohnnyF, zobacz moją zaktualizowaną odpowiedź - masz literówkę :) –

0

Mam ten problem i próbowałem go rozwiązać na wiele sposobów. W końcu okazało się, że ponownie go rozwiązano. Powód jest następujący: Dostałem kod źródłowy wraz z plikami obiektowymi skompilowanymi wcześniej ze starą wersją gcc. Kiedy moja nowsza wersja gcc chce połączyć te stare pliki obiektów, nie jest w stanie rozwiązać niektórych funkcji. Zdarza mi się kilka razy, że dystrybutorzy kodu źródłowego nie czyszczą się przed pakowaniem, więc make clean zaoszczędził dzień.

1

Czasem wystąpił ten błąd, ponieważ kompilacja nie powiodła się w środkowej części żadnej kompilacji. Najlepszym sposobem na wypróbowanie jest robienie czystego i ponownie tworzenie całego kodu.

+0

To jest dokładnie moja sprawa. Jest n problem z kodem, ale nadal dostaję błąd! – Pedram

0

ogólnie ten problem wystąpił, gdy wywołaliśmy funkcję, która nie została zdefiniowana w pliku programu, więc aby rozwiązać ten problem, sprawdź, czy wywołałeś taką funkcję, która nie została zdefiniowana w pliku programu.

-1
  1. Przejdź do Zaawansowane ustawienia systemu we właściwościach komputera
  2. Kliknij Zaawansowane
  3. Obejrzyj zmiennej środowiskowej
  4. Wybierz opcję ścieżki
  5. zmienić opcję ścieżka do folderu bin dev c
  6. Zastosuj i zapisz
  7. Teraz ponownie zapisz kod w folderze bin w deweloperze c
+0

Nie wiem, co myślisz o tych krokach, ale na pewno nie naprawią tego błędu kompilacji. –

+0

Mam ten sam problem co oryginalne pytanie, a ta odpowiedź, będąc całkowicie nie na temat, naprawdę mnie rozśmieszy! Dzięki za to ^^ – Malick

Powiązane problemy