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语言标准的头文件+源文件分离模式:
- 修改
main.c,将#include "server.c"替换为#include "server.h" - 在
server.h中添加validAccounts的外部声明,告诉编译器该变量在其他源文件中定义:
在server.h末尾添加如下代码:extern ST_accountsDB_t validAccounts[250]; - 编译时同时传入
main.c和server.c两个源文件(例如使用命令:gcc main.c server.c -o myserver)
这样处理后,validAccounts的定义仅存在于server.obj中,main.c通过extern声明知晓该变量的存在,链接阶段不会再出现重复定义问题。
内容的提问来源于stack exchange,提问作者Ahmed Hal
相关产品推荐
相关产品推荐

