LNK2005与LNK1169链接错误求助:C语言符号重复定义问题
解决C语言链接错误LNK2005和LNK1169的方案
错误原因
链接错误LNK2005和LNK1169的核心问题是函数getCardHolderName被多次定义:
- 在
main.c中直接包含了card.c源文件,编译main.c时会将card.c的代码一并编译,生成包含该函数定义的main.obj; - 同时
card.c本身会被编译成card.obj,其中也存在getCardHolderName的定义; - 链接阶段合并两个目标文件时,发现同一个函数存在两份定义,因此触发报错。
修复步骤
修正main.c的包含语句
将main.c中的#include "card.c"替换为#include "card.h"。头文件(.h)仅包含函数声明、结构体和枚举定义,不会引发重复定义问题。同时修正main函数的标准写法,并调整函数调用的参数传递:// 修改后的main.c #include <stdio.h> #include "STD_TYPES.h" #include "card.h" ST_cardData_t NewCustomer; int main(void) { uint8_t x; // 传递结构体指针,符合函数声明的参数要求 x = getCardHolderName(&NewCustomer); if (x == 0) { printf("Name is Valid"); } else { printf("Name is Invalid"); } return 0; // 标准main函数需返回int类型值 }确保编译所有源文件
- 若使用IDE(如Visual Studio),确认
main.c和card.c均被添加到项目的源文件列表中,编译时会自动生成两个目标文件并正确链接; - 若手动使用gcc编译,执行命令:
gcc main.c card.c -o Payment_Application
- 若使用IDE(如Visual Studio),确认
替换废弃的gets函数(可选但推荐)
gets函数已被C标准废弃,存在缓冲区溢出风险,建议改用fgets并处理换行符:// 修改后的card.c中getCardHolderName函数 EN_cardError_t getCardHolderName(ST_cardData_t* cardData) { printf("Please Enter The Card Holder Name (24 characters max - 20 characters min) : "); // 使用fgets限定读取长度,避免溢出 fgets(cardData->cardHolderName, sizeof(cardData->cardHolderName), stdin); // 移除fgets读取到的换行符 size_t len = strlen(cardData->cardHolderName); if (len > 0 && cardData->cardHolderName[len-1] == '\n') { cardData->cardHolderName[len-1] = '\0'; } if ((strlen(cardData->cardHolderName) <= 24) && (strlen(cardData->cardHolderName) >= 20)) { return OK; } else { return WRONG_NAME; } }
内容的提问来源于stack exchange,提问作者Omar A. Abdelazim
相关产品推荐
相关产品推荐

