C++矩阵乘法测试报Linker2005重复定义错误如何解决?
错误原因
LNK2005重复定义错误的核心诱因是你在stress.cpp中直接引入了.cpp源文件,违背了C++的常规编译规则:
- 默认情况下,每个
.cpp文件都会作为独立编译单元单独编译,生成对应的.obj目标文件 - 你的
naive.cpp、strassen.cpp会分别生成naive.obj、strassen.obj,各自携带naive、strassen函数的实现定义 stress.cpp中#include "naive.cpp"和#include "strassen.cpp"的操作,相当于把两个源文件的代码完全拷贝到了stress.cpp中,编译生成的stress.obj也会携带这两个函数的实现定义- 链接阶段三个
.obj文件存在重复的函数符号,就会触发重复定义错误。
修复方案
正规方案(推荐)
- 新增两个头文件,分别存放函数声明:
naive.h
#pragma once #include <vector> using namespace std; vector<vector<int>> naive(vector<vector<int>>a, vector<vector<int>>b);
strassen.h
#pragma once #include <vector> using namespace std; vector<vector<int>> strassen(vector<vector<int>>a, vector<vector<int>>b);
- 修改
stress.cpp的引入代码,将原本引入.cpp的两行替换为引入头文件:
// 替换掉原来的 #include "naive.cpp" #include "strassen.cpp" #include "naive.h" #include "strassen.h"
- 保持三个
.cpp文件都加入项目编译列表即可正常编译链接。
临时方案(不推荐)
直接把naive.cpp和strassen.cpp从项目的编译列表中移除,不需要修改stress.cpp的引入代码。因为stress.cpp已经包含了两个算法的完整实现,不会再生成对应obj文件,也就不会出现符号重复的问题。
额外注意事项
你当前strassen函数直接返回输入矩阵a,仅当b为单位矩阵时计算结果才会和朴素矩阵乘法结果一致,正常随机输入下测试会直接判定结果错误,后续实现完Strassen算法逻辑后即可恢复正常测试。
内容的提问来源于stack exchange,提问作者Ahmed Hossam Aldeen
相关产品推荐
相关产品推荐

