微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C无法编译 – 架构x86_64找不到符号

我的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的Snippits

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

解决方法

你可以编译,但是你无法链接.

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

原文地址:https://www.jb51.cc/c/112964.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐