C++移动main函数后编译出现multiple definition多重定义错误求助
错误原因
你遇到的是C++多编译单元链接时的全局变量多重定义错误,核心原因如下:
SEARCH_MATRIX和EXTS_ARRAY两个全局数组被直接定义在了FilesSearcher.h头文件中- 这个头文件同时被
test_file_searcher.cpp和FilesSearcher.cpp两个源文件引入,导致两个编译单元生成的目标文件中都存在这两个数组的实体定义,链接器无法判断应该使用哪一份,因此报多重定义错误 - 之前把main函数放在
FilesSearcher.cpp时,整个项目只有FilesSearcher.cpp引入了该头文件,仅有一份定义,因此不会触发错误
修复方案
有两种常用修复方式,推荐使用第二种:
方案1:给全局数组增加static修饰
将FilesSearcher.h中的数组定义改为:
#define SIZE_SEARCH_MATRIX 0x6 static const char *SEARCH_MATRIX[] = {"test", "prova", "lol", "asd", "lmao", "rotfl"}; #define SIZE_EXTS_ARRAY 0x1 static const char *EXTS_ARRAY[] = {"txt"};
- 原理:
static修饰的全局变量作用域仅限定在当前编译单元,两个源文件引入后会各自生成独立的数组副本,不会产生链接冲突 - 适用场景:数组数据量小,不需要跨编译单元保持同一个实体的场景
方案2:头文件仅声明,源文件中实现定义
第一步:修改FilesSearcher.h中的数组定义为extern声明:
#define SIZE_SEARCH_MATRIX 0x6 extern const char *SEARCH_MATRIX[]; #define SIZE_EXTS_ARRAY 0x1 extern const char *EXTS_ARRAY[];
第二步:在FilesSearcher.cpp中添加数组的实体定义:
#include "FilesSearcher.h" // 新增以下内容 const char *SEARCH_MATRIX[] = {"test", "prova", "lol", "asd", "lmao", "rotfl"}; const char *EXTS_ARRAY[] = {"txt"}; // 原有其他代码保持不变
- 原理:整个项目仅在
FilesSearcher.cpp中存在一份数组实体,其他源文件通过头文件的extern声明引用该实体,不会产生多重定义 - 优势:仅占用一份内存,符合C++全局变量的编码规范
附加优化建议
- 字符串字面量本身默认以
\0结尾,不需要手动加\0,多余的\0可以删除 - 建议给所有头文件添加头文件保护(
#ifndef/#define/#endif或#pragma once),避免头文件重复包含引发的其他问题
内容的提问来源于stack exchange,提问作者I_4m_Z3r0
相关产品推荐
相关产品推荐

