You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LNK2005与LNK1169链接错误求助:C语言符号重复定义问题

解决C语言链接错误LNK2005和LNK1169的方案

错误原因

链接错误LNK2005和LNK1169的核心问题是函数getCardHolderName被多次定义:

  • 在main.c中直接包含了card.c源文件,编译main.c时会将card.c的代码一并编译,生成包含该函数定义的main.obj;
  • 同时card.c本身会被编译成card.obj,其中也存在getCardHolderName的定义;
  • 链接阶段合并两个目标文件时,发现同一个函数存在两份定义,因此触发报错。

修复步骤

  1. 修正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类型值
    }
    
  2. 确保编译所有源文件

    • 若使用IDE(如Visual Studio),确认main.c和card.c均被添加到项目的源文件列表中,编译时会自动生成两个目标文件并正确链接;
    • 若手动使用gcc编译,执行命令:
      gcc main.c card.c -o Payment_Application
      
  3. 替换废弃的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 10:57:42