利用C++开发专用功能库时遇到的符号多重定义问题

蓝色雨滴 发布于 2018/10/09 23:30
阅读 130
收藏 1

在用C++实现某专用功能库(REWS.lib)的过程中,遇到了符号重定义的问题。将问题现象描述如下:
在REWS.lib的编写过程中,参考了第三方开源功能库(名为SP++,主要用于信号处理和数值计算)。该开源库基于C++模板编写,所有算法均以C++头文件形式组织而成,不需要进行本地编译,所以直接将它提供的所有头文件包含在了REWS.lib项目中。
该功能库提供了数字滤波器设计功能,分别包含在fir.h和fir-impl.h这两个头文件中,下面用伪码形式,给出这两个文件的主要结构。首先给出fir.h的主要代码,如下面的代码所示。它是包含在splab命名空间内的,并且在定义的最后,包含了fir-impl.h文件。

#ifndef FIR_H
#define FIR_H

//相关头文件包含(均为SP++库自行实现)
#include <window.h>
#include <dfd.h>
……

namespace splab
{
	class FIR : public DFD
	{
	public:
		FIR(const string &fType, const string &wType);
		~FIR();

		void    design();
		void    dispInfo();

	protected:

	private:
		string  windType;

	};

	#include <fir-impl.h>
}

#endif

而fir-impl.h文件的主要实现代码如下所示:

FIR::FIR(const string &fType, const string &wType)
	: DFD(fType), windType(wType)
{
	//实现代码略
}

FIR::~FIR()
{

}

void FIR::design()
{
	//实现代码略
}

void FIR::dispInfo()
{
	//实现代码略
}

在REWS.lib功能库的实现过程中,有两个功能组件均使用到了数字滤波器设计功能,将它们用IFFilter和IQFilter进行区分。在使用过程中主要的代码摘录如下。
首先给出IFFilter类中使用的代码,如下所示。

#include <fir.h>

using namespace splab;

void IFFilter::BandPassFilterGenerate()
{
	//参数赋值代码
	……

	//创建滤波器
	FIR fir("bandpass", "Hamming");

	//执行滤波器设计操作
	fir.design();

	//显示滤波器设计结果及详细信息
	fir.dispInfo();
}

接下来给出IQFilter类中使用的代码,如下所示。

#include <fir.h>

using namespace splab;

void IQFilter::LowPassFilterGenerate()
{
	//参数赋值代码
	……

	//创建滤波器
	FIR fir("lowpass", "Hamming");

	//执行滤波器设计操作
	fir.design();

	//显示滤波器设计结果及详细信息
	fir.dispInfo();
}

在REWS.lib功能库编译的过程中,就已经提示上述两个组件生成的obj中存在着重复定义,包括FIR的创建、析构、design和disoInfo函数等,但是是以警告的方式给出,相应的类型为waring LNK4006
忽略了上述警告信息,在编写测试程序,测试IFFilter和IQFilter这两个功能组件的正确性时,直接报error LNK2005的错误信息,FIR的创建、析构、design和disoInfo函数等均存在着多重定义
请教各位编程达人,应当如何解决上述的错误?先谢谢了。

加载中
0
qwsdcv
qwsdcv

实现别放头文件里。单独拿出来个cpp 。

实现放头文件里,另外俩文件include 当然重复定义了。

返回顶部
顶部