我尝试制作一个需要激活器功能的系统。这个激活器函数可能有状态,所以我尝试将状态放入一个concurrency::array_view。当我尝试构建解决方案时,我收到以下链接器错误。
错误 2 错误 LNK2019:无法解析的外部符号“public: static double __thiscall ArtNeuroNet::ActivationFunctions::Activator::function(double,class Concurrency::array_view) restrict(cpu, amp)”(?function@Activator@ActivationFunctions@ArtNeuroNet@ @SENNV?$array_view@N$00@Concurrency@@@ DZ _B) 在函数 _wmain D:\Projekte\ArtNeuroNet\ArtNeuroNet\ArtNeuroNet.obj ArtNeuroNet 中引用
错误 3 error LNK1120: 1 unresolved externals D:\Projekte\ArtNeuroNet\Debug\ArtNeuroNet.exe 1 1 ArtNeuroNet
我的简化激活器看起来像
double Activator::lin_function(double x, concurrency::array_view<double, 1> state)
restrict(cpu, amp)
{
if (x > state[StateParameterType::ThresholdParameter])
return 1;
else if (x < -(state[StateParameterType::ThresholdParameter]))
return 0;
else
return state[StateParameterType::AlphaParameter] * x + 0.5f;
}
double* Activator::getInitialState(double alpha)
{
double stateCpu[] = {1.0, 0.5};
if (alpha != NULL)
stateCpu[0] = alpha;
return stateCpu;
}
我的激活器创建看起来像
Activator activator = *(new Activator());
double* stateCpu = activator.getInitialState(1.0);
concurrency::array_view<double, 1> state(2, stateCpu);
activator.lin_function(0.4, state);
出于测试目的,我添加了最后一行,即调用activator.lin_function(0.4, state)。如果我注释掉该行,项目将毫无问题地构建。
我现在的问题是,我错过了什么或者我在做什么,而我实际上不应该这样做?
编辑
方法 lin_function 是私有的。但是,在 Activator 中有一个公共方法函数,它调用私有方法 lin_function。出于简化的原因,我将源代码的那部分排除在外。这两种方法都是可访问的,否则当对方法 lin_function 的调用被注释掉时,我将无法构建解决方案。
Activator 完全位于同一个项目中,该项目目前是一个控制台应用程序。
lin_function 依赖于单个状态变量。但是,激活函数的阈值实现根本不需要任何状态存储。将所有内容更改为阈值激活函数并将其余部分注释掉的反应方式相同。特别是“lin_function 已注释掉 -> 没有链接器错误,否则 -> 链接器错误”</p>
编辑 2
对于 Activator,存在一个标头 (Activator.h) 和源文件 (Activator.cpp)。不知何故,链接器似乎无法从声明为restrict(cpu, amp)的标头中找到任何方法。
// Doesn't get found and throws linker error
double Activator::function(double x)
restrict(cpu, amp)
{
return (x >= 0) ? 1 : 0;
}
// Get's found and no linker errors occur
double Activator::function(double x)
{
return (x >= 0) ? 1 : 0;
}
编辑 3
在头文件中将所有包含限制(amp,cpu)的方法定义为静态后,一切都正确构建并且运行没有问题。
当使用 restrict(amp, cpu) 时,实际上是否对需要静态的方法有限制?