【发布时间】:2020-08-21 17:56:25
【问题描述】:
我正在用 C 语言做一个简单的项目,目前我使用两个结构:Player 和 Card。 我在不同的头文件中创建了 2 结构,因为 Player 中的函数使用 Card,但还有其他我尚未完成的元素。 当我尝试在 Player 中使用 getId() 时,VSCode 的编译器会说:
对外部符号 _getId 的引用未在 _discardCard() 中解析
card.h 代码为:
#include <stdbool.h>
typedef struct card{
int id;
bool black;
int numElems;
char* text[3];
}card;
card* initCard(int id,bool black,char* text[],int numElems)
int getId(card* c);
card.c 代码为:
#include "carta.h"
#include<stdio.h>
#include <stdbool.h>
#include <stdlib.h>
...
int getId(carta* c){
return c->id;
}
而 Player.h 的代码是:
#include "card.h"
#define CARDSMAX 5
typedef struct{
bool master;
int id;
int points;
char* nickname;
card* cards[CARDSMAX];
int NumCards;
}player;
... //other functions
card* discardCard(int id,player* g);
Player.c 的代码是:
#include "player.h"
#include <stdio.h>
#include <stdlib.h>
player* initPlayer(char* nickname,int id){
player* g=(player*) malloc(sizeof (player));
g->id=id;
g->nickname=nickname;
g->master=false;
g->points=0;
g->NumCards=0;
for(int i=0;i<CARDSMAX;i++){
g->cards[i]=(card*)malloc(sizeof(card));
}
return g;
}
....
card* DiscardCard(int id,player* g){
for(int i=0;i<CARDSMAX;i++){
card* c=g->cards[i];
if(getId(c)==id){
card* e= g->cards[i];
g->cards[i]=NULL;
g->NumCards--;
return e;
}
}
return NULL;
}
有人可以帮助我吗? (如果您发现代码中有一些不一致的地方,那是因为我尝试使用我的语言进行快速翻译)
【问题讨论】:
-
拼写?
GetId与getId。链接器说第一个,你的原型说第二个。 -
已纠正错字:还是在
card.c中仍然存在?你用什么编译的?来自card.c的目标文件是否指定用于链接? -
@WeatherVane 对不起,我输入了错误的东西,编译器说 getId 和 discardCard,我用正确的替换了消息
-
您的 MAKEFILE 是否告诉它编译
card.c并链接card.obj?它怎么知道card.c?它知道card.h,但你在哪里告诉它card.c? -
好的,我找到了链接cart.obj的方法,我首先编译了card.c,然后编译了player.c:
cl player.c /link card.obj,最后一切正常,非常感谢@WeatherVane和@Dmitri