C语言项目出现LNK2019未解析外部符号错误如何修复?
LNK2019链接错误修复方案
三个LNK2019错误全部是标识符不匹配导致的,C语言链接阶段会严格匹配函数/变量名的拼写、大小写,任何不一致都会触发找不到符号的错误,逐个对应修复即可:
对应三个报错的直接修复
_fscnaf无法解析:纯拼写笔误,标准库没有fscnaf这个函数,你把文件输入函数fscanf的字母顺序写反了,找到main里的while (fscnaf(instructions, "%d", &Option) != 1)这行,把fscnaf改回fscanf。_Error_msg无法解析:C语言大小写敏感,你定义的错误提示函数名是Error_Msg(M大写),但main里两次调用都写成了小写m的Error_msg;另外你把这个函数的前置声明用三斜杠注释掉了,先把///void Error_Msg(char*);///的注释去掉恢复声明,再把两处调用的函数名改成Error_Msg和定义保持一致。_CreateProducts无法解析:函数名单复数拼写不一致,你在开头声明、main里调用的都是带末尾s的CreateProducts,但下方实际写的函数实现名是不带s的CreateProduct,把实现的函数名改成CreateProducts即可。
后续需要处理的其他编译/运行问题
改完上面三处就能解决当前的链接错误,但代码里还有其他会导致编译失败、运行崩溃的问题,一并修复:
- 结构体定义错误:
Item和table结构体里写的struct Node* next没有对应类型,整个项目从未定义Node结构体,你的链表节点本身就是Item类型,把这两处的struct Node*替换为struct Item*。 - 函数声明与实现参数不匹配:
Delete函数前置声明写的是值传参void Delete(kitchen);,但实际实现是指针参数void Delete(P_kit kit),把前置声明改成void Delete(P_kit);对齐实现。AddItems、OrderItem的产品名参数声明成了单字符char类型,但实际传入的是字符串(char*),把AddItems的第二个参数改为char* added,OrderItem的第四个参数改为char* order。RemoveItem、RemoveTable的第二个参数声明是table*,但实现里错写成了指针数组table* table_n[50](二级指针),同时main里调用时传的&table_n[50]是数组越界地址(长度50的数组合法下标是0~49),把两个函数的该形参统一改成table* table_arr,调用时直接传入数组名table_n即可。
- 逻辑bug修复:
CreateProducts里内存分配失败的分支只释放了指针没有退出程序,后续访问空指针会直接崩溃,在free之后加exit(1)。- 桌号合法性判断的逻辑运算符写反了,
table_num <=0 && table_num >50是永远不可能成立的矛盾条件,把&&改成||,才能正确拦截非法桌号。
内容的提问来源于stack exchange,提问作者ronben17
相关产品推荐
相关产品推荐

