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