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

C语言编译报LNK2005错误求助:validAccounts重复定义问题

编译报错LNK2005/LNK1169:符号重复定义问题解决

问题背景

将代码拆分到server.h、server.c、main.c三个文件后,在main.c中直接包含server.c,编译时出现重复定义错误,但合并所有代码到单个文件时可正常运行,需排查问题。

问题代码

server.h

typedef char uint8_t;

typedef enum EN_accountState_t
{
    RUNNING,
    BLOCKED
}EN_accountState_t;

typedef struct ST_accountsDB_t
{
    float balance;
    EN_accountState_t state;
    uint8_t primaryAccountNumber[20];
}ST_accountsDB_t;

server.c

#include "server.h"

ST_accountsDB_t validAccounts[250] = { { 2000,RUNNING,"5807007076043875" }
,{ 3000,RUNNING,"5807007076043876" },{ 40000,BLOCKED,"5807007076043877" }
,{ 5000,RUNNING,"5807007076043878" } ,{ 6000,RUNNING,"5807007076043879" } };

main.c

#include <stdio.h>

#include "server.c"

int main() {

printf("balance =  %f", validAccounts[0].balance);

}

错误信息(中文翻译)

错误 LNK2005 validAccounts 已在 main.obj 中定义   
错误 LNK1169 发现一个或多个多重定义的符号

问题原因

直接在main.c中包含server.c是错误的做法:

  • 编译server.c时,会生成server.obj,其中包含validAccounts的完整定义
  • 编译main.c时,由于#include "server.c",validAccounts的定义会被再次嵌入到main.obj中
    链接阶段,链接器检测到两个目标文件中都存在validAccounts的定义,因此抛出重复定义错误。

解决方法

采用C语言标准的头文件+源文件分离模式:

  1. 修改main.c,将#include "server.c"替换为#include "server.h"
  2. 在server.h中添加validAccounts的外部声明,告诉编译器该变量在其他源文件中定义:
    在server.h末尾添加如下代码:
    extern ST_accountsDB_t validAccounts[250];
    
  3. 编译时同时传入main.c和server.c两个源文件(例如使用命令:gcc main.c server.c -o myserver)

这样处理后,validAccounts的定义仅存在于server.obj中,main.c通过extern声明知晓该变量的存在,链接阶段不会再出现重复定义问题。


内容的提问来源于stack exchange,提问作者Ahmed Hal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:06:29