17

私の C コードに深刻な問題があり、それをコンパイルできないようで、その理由が本当にわかりません。

オンラインで調べてみましたが、問題の解決策が見つかりません。何か心当たりはありますか?

御時間ありがとうございます!

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

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;
}

そして、それが不平を言っているように見える.hファイル

#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);
4

3 に答える 3

28

コンパイルはできますが、リンクはできません。

part1.o最後のファイルで定義した関数を使用して.hおり、実装が見つかりません。プログラムをリンクするときは、それらの関数の実装を含むオブジェクト ファイル (またはライブラリ) でリンクしていることを確認する必要があります。あなたはおそらく次のようなことをしたでしょう:

gcc part1.c -o myapp

そのため、リンカーにはパズルのピースがすべて揃っているわけではありません。

部分的にコンパイルする場合は、次のことを行う必要があります。

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

ここでは、すべての.cファイルがオブジェクト ( ) ファイルに個別にコンパイルさ.oれ、実行可能ファイルにリンクされます。または、すべてを一度に行うこともできます。

gcc part1.c implementations.c -o myapp

実装がライブラリにある場合 ( libimplementations.a):

gcc part1.c -Lpath/to/libs -limplementations -o myapp
于 2012-04-13T15:48:40.210 に答える
5

同様のコンパイルエラーが発生していたことを追加したいと思います。下記参照。

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

ヘッダー ファイルで作成した add() 関数のプロトタイプを実装することで、この問題を解決しました。実装すると、このエラーは表示されなくなりました。他の誰かを助けるかもしれません。

于 2012-10-06T05:16:54.520 に答える
0

同じエラーを示す最小限の例を作成してみます。これを診断するのに役立つ情報が多すぎます。他のファイルのコードと実際のコンパイル コマンド (Makefile の一部ではなく、実際のコマンド) がこの問題の原因である可能性があります。

(はい、これは回答ではなくコメントである必要がありますが、何らかの理由で質問にコメントすることはできません)

于 2012-04-13T15:46:09.700 に答える