在写C++项目时,遇到最头疼的问题莫过于 '一个或多个多重定义'。
分析产生的原因:
首先,在mylib.h中定义了一些函数,并对函数实现。我的mylib.h
#include<vector>
namespace az{
namespace utl{
void minfastsort(double x[], int idx[], int n, int m)
{
for(int i=0; i<m; i++)
{
for(int j=i+1; j<n; j++)
if(x[i]>x[j])
{
double temp = x[i];
x[i] = x[j];
x[j] = temp;
int id = idx[i];
idx[i] = idx[j];
idx[j] = id;
}
}
}
double dist_array(double vec1[], double vec2[], int dim)
{
double sum = 0;
for(int n=0; n<dim; n++)
sum+= (vec1[n] - vec2[n])*(vec1[n] - vec2[n]);
return sqrt(sum);
}
double dist_vector(std::vector <double> &vec1, std::vector <double> &vec2)
{
int dim = vec1.size();
double sum = 0;
for(int n=0; n<dim; n++)
sum+=(vec1[n] - vec2[n])*(vec1[n] - vec2[n]);
return sqrt(sum);
}
double norm_vector(std::vector <double> &vec)
{
int dim = vec.size();
double sum = 0;
for(int i=0;i<dim;i++)
sum = sum + vec[i]*vec[i];
return sqrt(sum);
}
double sum_vector(std::vector<double>&vec)
{
int dim = vec.size();
double sum = 0;
for(int i=0;i<dim;i++)
sum = sum + vec[i];
return sum;
}
// inner product
double prod_vector(std::vector <double>&vec1, std::vector <double>&vec2)
{
int dim = vec1.size();
double sum = 0;
for(int i=0; i<dim; i++)
sum+= vec1[i]*vec2[i];
return sum;
}
}
}
其次,我们分别在两个.cpp文件中调用mylib.h中的函数。如:Response.cpp和SGEA.cpp中调用mylib.h中的函数。这样导致重定义,即是,Mylib.h中的函数存在多个定义。
解决方案1:我们需要对mylib.h函数修改,在这个函数中仅定义,实现函数的定义在.cpp文件中。
#ifndef __MYLIB_H_
#define __MYLIB_H_
#include<vector>
namespace az{
namespace utl{
void minfastsort(double x[], int idx[], int n, int m);
double dist_array(double vec1[], double vec2[], int dim);
double dist_vector(std::vector <double> &vec1, std::vector <double> &vec2);
double norm_vector(std::vector <double> &vec);
double sum_vector(std::vector<double>&vec);
// inner product
double prod_vector(std::vector <double>&vec1, std::vector <double>&vec2);
}
}
#endif
然后,把函数的实现部分copy到一个.cpp文件,问题得到解决。