1. ホーム
  2. c

[解決済み] Cコンパイル : collect2: エラー: ldは1終了ステータスを返しました。

2022-03-03 08:43:43

質問

ネットでそのバグを検索してみましたが、C++用の投稿ばかりです。

これはメッセージです。

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

超単純なコードで、何が問題なのか理解できない

#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;
...

これはヘッダーdict.hです。

#ifndef _DICT_H_
#define _DICT_H_

#include "hash.h"

pHash CreateDictionary();
...

#endif

そして、以下は 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;
}

そして、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

ここでファイルを渡せば簡単かも?

いずれにせよ、問題を理解するためのヒントを頂ければ幸いです。

解決方法は?

あなたの問題は、関数CreateDのtypoです。 e ctionary() に変更する必要があります。 i ctionary()を参照してください。 collect2: error: ld returned 1 exit status は、CでもC++でも同じ問題で、通常、未解決のシンボルがあることを意味します。あなたの場合は、私が前に述べたタイプミスです。