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文件都被分别编译成 object ( .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 回答