我的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);
答案 0 :(得分:21)
您可以编译,但不能链接。
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
答案 1 :(得分: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()函数原型解决了这个问题。一旦实现,我不再收到此错误。可以帮助别人。
答案 2 :(得分:0)
我尝试创建一个显示相同错误的简约示例。我们缺少太多信息来帮助您诊断。其他文件中的代码和实际编译命令(不仅仅是Makefile的一部分,而是实际命令)可能是此问题的根源。
(是的,这应该是评论而不是答案,但由于某些原因我无法对问题发表评论)